POJ1363出栈入栈匹配问题

参考POJ1363

简要分析:

一个序列需满足从小到大入栈,可随时出栈入栈。给出一个参考序列,是否存在按参考序列出栈的情况。


先输入参考序列到数组,按1到N依次进栈,在进栈的过程中,如果等于参考序列当前的数,出栈,参考序列后移一位,如果还相等,继续出栈和后移。如果不等,则入栈。如果用栈,可以判断最后栈是否为空。用数组模拟,模拟计数出栈的个数。如果弹出个数相等,匹配成功。

下面用数组模拟入栈出栈:


代码:

#include<iostream>
using namespace std;
int main() {
	int N;
	while (cin >> N, N != 0) {
		int Data[N], Temp[N + 1];
		int i = 0, count = 0, k = 0;
		while (cin >> Data[0], Data[0] != 0) {
			for (i = 1; i < N; i++)
				cin >> Data[i];
			for (i = 1, k = 0, count = 0; i <= N && count < N; i++, k++) {
				Temp[k] = i; //类比1到N的入栈
				while (Temp[k] == Data[count]) //如果相等,下一个数还是存放在当前位置,k要-1
				{
					if (k > 0)
						k--;
					else {
						Temp[k] = 0; //k=0,相当于栈空,避免存在相等的情况,重新初始化0;
						k--;
					}
					count++; //类比弹栈的个数
					if (k == -1)
						break;
				}

			}
			if (count == N) //弹出个数相等
				cout << "Yes" << endl;
			else
				cout << "No" << endl;
		}
		cout << endl;
	}
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值