1051 Pop Sequence (25分)模拟入栈出栈

模拟入栈出栈
r

link

//有一个栈,大小为M,有N个数字,数字1~N只能按顺序依次入栈。
//给出K个出栈序列,判断该序列是否是可以实现的出栈序列。

//入栈顺序是确定的(1-N依次入栈),我们只需要模拟这个过程。

//先把输入的序列接收进数组seq[],
//设index= 1,表示当前比较的是序列哪个元素,
//然后按顺序1~n把数字进栈,每进入一个数字,判断有没有超过栈容量m,
//超过了就break。

//如果没超过,看看当前序列元素seq[index]是否与栈顶元素s.top()相等:
//while相等就一直弹出栈s.pop(),index++,相当于当前序列元素匹配成功,继续处理下一个;
//不相等就继续按顺序把数字压入栈。
//若能完美模拟,最终栈应该是空的,说明这个序列是可能的,输出YES

#include <stack>
#include <iostream>

using namespace std;

int maxn, n, q;
//vector<int>v;


int main() {
	cin >> maxn >> n >> q;
    int num[n] = { 0 };
	stack<int>s;

	while (q--) {
		for (int i = 1; i <= n; i++) {//存储每行可能的出栈顺序
			scanf("%d", &num[i]);
		}

		while (!s.empty()) {//只要stack栈内不为空,有元素,则弹出元素
			s.pop();
		}

		int cur = 1;
		bool flag = true;
		for (int i = 1; i <= n; i++) {//入栈顺序唯一:1,2,3,4,5,6...n
			s.push(i);
			if (s.size() > maxn) {
				flag = false;
				break;
			}
			while (!s.empty()&&num[cur]==s.top()) {
				s.pop();
				cur++;
			}
		}
		if (flag == true && s.empty() == true)
			cout << "YES\n";
		else cout << "NO\n";
	}
	return 0;
}

---------------------------------

#include <cstdio>
#include <stack>
#include <iostream>
using namespace std;
const int N = 1010;

stack<int> st;
int num[N] = { 0 };//存放需要入栈元素的数组

int main() {
	int m, n, q;//栈的容量大小,需要入栈的元素的个数,需要询问可能出栈的顺序的个数
	cin >> m >> n >> q;
	for (int i = 0; i < q; i++) {
		while (!st.empty()) {
			st.pop();
		}
		for (int i = 1; i <= n; i++) {
			cin >> num[i];//num[1]=1、num[2]=2......num[5]=5
		}
		
		int cur = 1;
		bool flag = true;
		for (int i = 1; i <= n; i++) {//入栈到栈顶元素和第?个出栈元素一样,就出栈
			st.push(i);
			if (st.size() > m) {
				flag = false;//满了满了,别插了
				break;
			}
			while (!st.empty() && st.top() == num[cur]) {
				st.pop();
				cur++;
			}
		}
		if(st.empty()==true&&flag==true)
			cout << "YES\n";
		else cout << "NO\n";
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值