假设以S
和X
分别表示入栈和出栈操作。如果根据一个仅由S
和X
构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入S
和X
序列,判断该序列是否合法。
输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由S
和X
构成的序列。序列保证不为空,且长度不超过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;
}
}