7-1 堆栈操作合法性(20 分)

假设以SX分别表示入栈和出栈操作。如果根据一个仅由SX构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入SX序列,判断该序列是否合法。

输入格式:

输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由SX构成的序列。序列保证不为空,且长度不超过100。

输出格式:

对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。

输入样例:

4 10
SSSXXSXXSX
SSSXXSXXS
SSSSSSSSSSXSSXXXXXXXXXXX
SSSXXSXXX

输出样例:

YES
NO
NO
NO
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
#define EXP_STACK 50
#define ERROR -1
#define OK 1
using namespace std;
typedef int Elemtype;
typedef int Status;
const int maxn = 1010;
int STACK_SIZE;
typedef struct
{
    Elemtype *base;
    Elemtype *top;
    int sta_len;
    int ElemNumber;
}Stack;
Status InitStack(Stack &Sta)
{
    Sta.base = (Elemtype *)malloc(STACK_SIZE*sizeof(Elemtype));
    if(!Sta.base) return -1;
    Sta.top = Sta.base;
    Sta.sta_len = STACK_SIZE;
    Sta.ElemNumber = 0;
}
Status GetTop(Stack sta,Elemtype &e)
{
    if(sta.top==sta.base) return ERROR;
    e = *(sta.top-1);
    return OK;
}
Status Push(Stack &S,Elemtype e)
{
    if(S.top-S.base>=S.sta_len)
    {
        S.base = (Elemtype *)realloc(S.base,(EXP_STACK+S.sta_len)*sizeof(Elemtype));
        S.sta_len+=EXP_STACK;
    }
    *S.top++ = e;
    S.ElemNumber+=1;
    return OK;
}
Status Pop(Stack &S)
{
    if(S.top==S.base) return ERROR;
    --S.top;
    S.ElemNumber--;
    return OK;
}
int main()
{
    int cases;
    int Len;
    scanf("%d%d",&cases,&Len);
    STACK_SIZE = Len;
    while(cases--)
    {
        char opr[110];
        scanf("%s",opr);
        int len = strlen(opr);
        Stack Sta;
        InitStack(Sta);
        //cout<<Sta.sta_len<<" "<<Sta.ElemNumber<<endl;
        bool Fits = true;
        for(int i = 0;i<len;i++)
        {
            if(opr[i]=='S')
            {
                if(Sta.ElemNumber==Len)
                {
                    Fits = false;
                    break;
                }
                Push(Sta,1);
            }
            else if(opr[i]=='X')
            {
                int Ans = Pop(Sta);
                if(Ans==-1)
                {
                    Fits = false;
                    break;
                }
            }
        }
        if(Sta.ElemNumber) Fits = false;
        if(Fits)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
}

  

PTA 堆栈操作合法性(20 分)的更多相关文章

  1. 7-31 堆栈操作合法性 (20 分) PTA

    7-31 堆栈操作合法性 (20 分)   假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该 ...

  2. PTA 7-4 堆栈操作合法性 (20 分)

    假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列.请编写程序,输入S ...

  3. pta 习题集5-6 堆栈操作合法性

    假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列.请编写程序,输入S ...

  4. PTA 输出全排列(20 分)

    7-2 输出全排列(20 分) 请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间. 输入格式: 输入给出正整数n(<10). ...

  5. PTA | 1012 数字分类 (20分)

    给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A1 = 能被 5 整除的数字中所有偶数的和: A2 = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1−n2+n ...

  6. PTA | 1029 旧键盘 (20分)

    旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 2 行中分别给出应该输入的文字.以及 ...

  7. PTA | 1019 数字黑洞 (20分)

    给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有" ...

  8. PTA 最小堆插入元素和删除堆顶(无哨兵元素) (20分)

    PTA 最小堆插入元素和删除堆顶(无哨兵元素) (20分) 对于给定的最小堆(优先队列),分别实现插入元素和删除堆顶的函数. 函数接口定义: int insertIntoHeap(struct Hea ...

  9. PTA 1005 Spell It Right (20)(20 分)水题

    1005 Spell It Right (20)(20 分) Given a non-negative integer N, your task is to compute the sum of al ...

随机推荐

  1. vue中使用第三方UI库的移动端rem适配方案

    需求:使用vue-cli脚手架搭建项目,并且使用第三方的UI库(比如vant,mint ui)的时候,因为第三方库用的都是用px单位,无法使用rem适配不同设备的屏幕. 解决办法:使用px2rem-l ...

  2. ATM-JAVA程序 //程序有5处相同错误,找不出原因 转账功能没有实现,修改密码来不及实现了

    package JCC;//信1705-3 20173681 靳晨晨import java.io.BufferedReader;import java.io.File;import java.io.F ...

  3. v-html对于↵转义的问题

    方法1 用pre标签展示 <pre v-html> </pre> 方法2 浏览器处理换行的时候,会进行自动合并 (1)设置 white-space: pre,禁用自动合并: ( ...

  4. java 数组和集合

    1.概念说明 区别:数组固定长度的,集合,数组的长度是可以变化的. List,继承Collection,可重复.有序的对象 Set,继承Collection,不可重复.无序的对象 Map,键值对,提供 ...

  5. QThread详解

    回顾Qt之线程(QThread),里面讲解了如何使用线程,但还有很多人留言没有看明白,那么今天我们来一起瞅瞅关于QThread管理线程的那些事儿... 一.线程管理 1.线程启动 void start ...

  6. Codeforces 841A - Generous Kefa

    题目链接:http://codeforces.com/problemset/problem/841/A One day Kefa found n baloons. For convenience, w ...

  7. [转载]C# 常用日期时间函数(老用不熟)

    原博地址:http://www.jb51.net/article/20181.htm --DateTime 数字型 System.DateTime currentTime=new System.Dat ...

  8. Selenium 常用定位对象元素的方法

    常见定位对象元素的方法 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方 ...

  9. jt项目菜单页面实现

    jt项目菜单页面实现 一. 业务描述: 1) 数据呈现时使用bootstrap中的treeGrid插件(基于jquery实现). bootstrap特点:简洁.直观.强悍.移动设备优先的前端开发框架, ...

  10. manytomany django 正查, 反查

    models from django.db import models from django.contrib.auth.models import User class GroupSheet(mod ...