堆栈操作合法性 C++

2023-07-30 11:30:08 浏览数 (2)

温馨提示:本题为深大OJ原题,深大的同学请勿直接抄袭,以免出现多个代码相同以致评0分的情况,代码和思路仅供参考,希望大家能逐步成长。

题目描述

假设以SX分别表示入栈和出栈操作。如果根据一个仅由SX构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入SX序列,判断该序列是否合法。

输入

输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由SX构成的序列。序列保证不为空,且长度不超过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;
	}
}

0 人点赞