假设以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<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
#include<iomanip>
using namespace std;
typedef long long ll;
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack;
int InitStack(SqStack &s,int L)//关于这里为什么要取地址不是很懂,同时为什么传输的时候没有传地址呢
{
s.base=new char[L];//创建一个那么大的字符类型的数组.同时base指向的是首地址
if(!s.base)//如果申请空间没成功
exit(OVERFLOW);
s.top=s.base;
s.stacksize=L;
return 1;
}
int push(SqStack &st,char c)
{
if(st.top-st.base==st.stacksize)
return 0;
else
{
*st.top++=c;
return 1;
}
}
int pop(SqStack &st,char c)
{
if(st.top==st.base)
return 0;
else
{
*st.top--;
return 1;
}
}
bool Isright(string s,int M)
{
int i=0;
int flag=1;
SqStack St;//定义一个栈
InitStack(St,M);
while(s[i]!='\0')
{
if(s[i]=='S')
{
if(push(St,s[i])==1)
i++;
else
{
flag=0;//标记是否进栈成功,如果栈满,则进栈不成功
break;
}
}
else
{
if(pop(St,s[i])==1)
i++;
else
{
flag=0;
break;
}
}
}
if(St.top==St.base&&s[i]=='\0')
flag=1;
else
flag=0;
if(flag==1)
return true;
else
return false;
}
int main()
{
int N,M,k=0;
cin>>N>>M;
string s;
char c;
for(int i=1;i<=N;i++)
{
cin>>s;
if(Isright(s,M)==true)
{
cout<<"YES"<<endl;
}
else
cout<<"NO"<<endl;
}
}