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. numpy高级应用

    reshape重塑数组 ravel 拉平数组 concatenate 最一般化的连接,沿一条轴连接一组数组 # print(np.concatenate([arr1,arr2],axis = 0)) ...

  2. 4、CentOS6.5下安装php5.3

    操作系统:CentOS6.5 环境:Apache2.2安装成功.可查看:http://www.centoscn.com/image-text/install/2014/0505/2910.html M ...

  3. linux /etc/shadow--passwd/pam.d/system-auth文件详解

     在linux操作系统中, /etc/passwd文件中的每个用户都有一个对应的记录行,记录着这个用户的一下基本属性.该文件对所有用户可读.   而/etc/shadow文件正如他的名字一样,他是pa ...

  4. The Little Prince-12/04

    The Little Prince-12/04 The wheat fields have nothing to say to me. And that is sad. But you have ha ...

  5. 重复打印相同内容(Doc档)的时候自动生成打印编号

    昨天突然接到一个好久未联系的朋友电话,说是江湖救急,要打印一份单据,单据上有个号码要自动生成,如下图,最土的办法是打印完一张,手工改下号码,但这种方法估计碰到成百上千张时估计会疯掉 网上找了实现方法, ...

  6. pprof函数名未翻译、为函数地址0x00000232382788

    这几天在分析一个性能未达预期的功能,使用gperftools cpu profiler生成后,使用pprof格式化的时候,发现pprof出的结果函数名未翻译.为函数地址,如下所示: 每个节点代表一个函 ...

  7. ORA-16038 ORA-19809 ORA-00312

    问题表现: 连接数据库启动报错,ORA-03113, 查看详细的alert日志发现更多报错,如下 ORA-19809: 超出了恢复文件数的限制ORA-19804: 无法回收 209715200 字节磁 ...

  8. php 带省略号的分页

    原文链接:https://blog.csdn.net/u011060253/article/details/25308455 $curpage = isset($_GET[; $page = new ...

  9. 关于VS2013下制作和使用静态库和动态库

    关于VS2013下制作和使用静态库和动态库 引言 什么是库:库是写好的现有的,成熟的,可以复用的代码. 所谓静态.动态是指链接.将一个程序编译成可执行程序的步骤: 静态库在链接阶段,会将汇编生成的目标 ...

  10. topcoder srm 490 div1

    problem1 link 首先每$n*m$一定是一个循环,所以只需要考虑时间$[0,n*m-1]$即可.这个期间一共出现了$n$个,第i个的出现时间为$m*i$,离开的时间为$\left \lcei ...