判断是否合法出入栈——Uva 514

嗯,,,这题基本上就是判断是否合法出入栈
需要注意的是有几个变量记得要回归初始状态!!!!
比如中间那个中间站,如果没法按照B目标出来了话,要把中间那个栈清空,当中B目标栈全部都出去了,并且A栈全部进去就说明成功了就可以Yes;

#include<iostream> 
#include<cstdio> 
#include<fstream> 
#include<algorithm> 
#include<cmath> 
#include<deque> 
#include<vector> 
#include<queue> 
#include<string> 
#include<cstring> 
#include<map> 
#include<stack> 
#include<set> 
#define N 10000
using namespace std;

int main() {

	int a, n = 1, ok = 1;
	int Tag[N], i;
	stack<int> s;
	queue<int> ans;	//用来记录答案 

	while (cin >> a && a)
	{

		while (cin >> Tag[1] && Tag[1]) {
			for (i = 2;i <= a;i++) {
				cin >> Tag[i];
			}
			
			ok = 1;
			n = 1;
			i = 1;		//初始化 
			while (i <= a) {  //i表示目标栈
				if (s.empty())
				{
					if (n <= a)  //n表示A栈
						s.push(n++);//如果是空栈并且还有元素可以入栈 
					else
					{	ok = 0;break;}			//如果没元素可以入栈说明失败
				}
				else if (s.top() == Tag[i]) //如果栈顶和目标相当 
				{						//就出栈,目标指针上移 
					s.pop();
					i++;
				}

				else if (n <= a) s.push(n++);//如果栈顶不相等 便入栈 

				else if (n > a) { ok = 0;break; }	//栈顶不相等还没元素入栈 
			}
		
			if (n >= (1 + a) && i == (1 + a)&&s.empty())	//如果目标出栈完并且入栈完
				ans.push(1);	//YES
			else
				ans.push(-1); 	//No 
		
			while (!s.empty())
				s.pop();
		}
		
		if (!Tag[1]) ans.push(0);

	}

	while (!ans.empty())
	{
		if (1 == ans.front())	printf("Yes\n");
		else if (-1 == ans.front()) printf("No\n");
		else printf("\n");
		ans.pop();
	}

	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值