输入格式:
输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由S
和X
构成的序列。序列保证不为空,且长度不超过100。
输出格式:
对每个序列,在一行中输出YES
如果该序列是合法的堆栈操作序列,或NO
如果不是。
输入样例:
4 10
SSSXXSXXSX
SSSXXSXXS
SSSSSSSSSSXSSXXXXXXXXXXX
SSSXXSXXX
输出样例:
YES
NO
NO
NO
代码:
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define LIST_INIT_SIZE 100000
#define LISTINCREMENT 10
#define mod 256
#define SElemType char
#define lowbit(x) (x&(-x))
#define mem(a,b) memset(a,b,sizeof(a))
#define FRER() freopen("in.txt","r",stdin);
#define FREW() freopen("out.txt","w",stdout);
using namespace std;
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
void InitStack(SqStack&S,int m){
S.stacksize = m;
S.base = (SElemType*)malloc(S.stacksize*sizeof(SElemType));
S.top = S.base;
}
int SPush(SqStack&S){
if(S.top-S.base>=S.stacksize) return 0;
S.top++;
return 1;
}
int Pop(SqStack&S){
// cout<<*S.top<<" "<<*S.base<<endl;
if(S.top==S.base) return 0;
--S.top;
return 1;
}
bool isRight(char *s,int m){
SqStack S;
InitStack(S, m);
bool flag = true;
int i;
for(i=0;s[i];i++){
if(s[i]=='S'){
if(!SPush(S)){
flag = false;
break;
}
}else{
if(!Pop(S)){
flag = false;
break;
}
}
}
if(S.top!=S.base) return false;
if(s[i]!='\0') return false;
return true;
}
int main(){
int T;
int m;
scanf("%d%d",&T,&m);
while(T--){
char s[1000];
scanf("%s",s);
if(isRight(s,m)) printf("YES\n");
else printf("NO\n");
}
}