温馨提示:本题为深大OJ原题,深大的同学请勿直接抄袭,以免出现多个代码相同以致评0分的情况,代码和思路仅供参考,希望大家能逐步成长。
题目描述
假设以S
和X
分别表示入栈和出栈操作。如果根据一个仅由S
和X
构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入S
和X
序列,判断该序列是否合法。
输入
输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由S
和X
构成的序列。序列保证不为空,且长度不超过100。
输出
对每个序列,在一行中输出YES
如果该序列是合法的堆栈操作序列,或NO
如果不是。
输入样例1
4 10 SSSXXSXXSX SSSXXSXXS SSSSSSSSSSXSSXXXXXXXXXXX SSSXXSXXX
输出样例1
YES NO NO NO
思路分析
嗯,如果有问题,那一般是判断条件的问题。
一般就是遇到S就压栈,遇到X就需要弹栈,然后我们来看细节:
上来先判断栈容量是否已经达到最大容量M,这里非常需要注意操作的准确性,M指的是栈的最大容量,不是序列的长度,50和100根本不用搭理这两个数字。
遇到S不管那么多直接压栈,遇到X先判断栈是不是空的,因为一般情况下我们的栈只有S在里面,如果是空的,那么说明肯定不对,直接寄(把S压入栈,跳出循环),遇到X并且栈非空,判断栈顶元素是不是匹配的S,不是就直接寄。
最后判断栈是不是空的,空的说明S都找到了自己的X,不是空的就寄。
AC代码
代码语言:javascript复制#include<bits/stdc .h>
using namespace std;
int main() {
int N,M;
cin >> N>>M;
while (N--) {
stack<char>test;
string temp;
cin >> temp;
for (auto&it : temp) {
if(test.size()>M){
test.push(it);
break;
}
if (it == 'S' )test.push(it);
else if (it == 'X' && test.empty()) {
test.push(it);
break;
} else if (it == 'X' && test.top() == 'S')test.pop();
}
if (test.empty())cout << "YES" << endl;
else cout << "NO" << endl;
}
}