假设以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
题目不难,但是我在输入待测序列是,一开始用的是
getchar();
gets(ch);
感觉没什么问题,结果也符合要求,但就是过不了。
后来试着把输入换成
scanf("%s",ch);
居然过了。
无语了,这是怎么回事?
我的代码现在看来真是啰嗦,一点也不简洁。
#include <stdio.h>
int main() {
int N, M, flag;
scanf("%d %d", &N, &M);
for (int i = 0; i < N; i++) {
flag = 1;
char ch[101];
scanf("%s",ch);
int stackSize = 0;
int chLength = strlen(ch);
for (int j = 0; flag && j < chLength; j++) {
switch (ch[j]) {
case 'S':
stackSize++;
if (stackSize > M) {
flag = 0;
printf("NO\n");
}
break;
case 'X':
stackSize--;
if (stackSize < 0) {
flag = 0;
printf("NO\n");
}
}
}
if (flag && stackSize == 0)
printf("YES\n");
else if (flag && stackSize != 0)
printf("NO\n");
}
return 0;
}
别人的简介不少
出处
#include<stdio.h>
#define S 1
#define X -1
int main(){
char str[100];
int n,m;
int i,count;
scanf("%d %d",&n,&m);
while(n--){
scanf("%s",str);
i=0;
count=0;
while(str[i]){
if(str[i]=='S'){
count++;
}
if(str[i]=='X'){
count--;
}
if(count<0||count>m){
break;
}
i++;
}
if(count==0){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}