判断栈的pop是否正确

题目:输入两个整数序列。其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序。


为了简单起见,我们假设 push 序列的任意两个整数都是不相等的。 
比如输入的 push 序列是 1、2、3、4、5,那么 4、5、3、2、1 就有可能是一个 pop 系列。
因为可以有如下的 push 和 pop 序列:
push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,
这样得到的 pop 序列就是 4、5、3、2、1。
但序列 4、3、5、1、2 就不可能是 push 序列 1、2、3、4、5 的 pop 序列。


分析:

如果我们希望 pop 的数字正好是栈顶数字,直接 pop 出栈即可;
如果希望 pop 的数字目前不在栈顶,我们就到push 序列中还没有被 push 到栈里的数字中去搜索这个数字,并把在它之前的所有数字都 push 进栈。
如果所有的数字都被 push 进栈仍然没有找到这个数字, 表明该序列不可能是一个 pop 序列。


程序:

#include <iostream>
#include <stack>
using namespace std;

int check(int input[],int output[],int n)
{
	stack<int> st;
	int j=0;
	for(int i=0;i<n;i++)
	{
		cout<<"i= "<<i<<endl;
		if(st.empty())//栈为空,把output[i]入栈。
		{
			while(j<n && input[j]!=output[i])
				st.push(input[j++]);
			if(j==n)
				return 0;//不符合,因为input中没有output[i]这个元素
			j++;//跳过output[0]这个值,相当于先push后pop。
			
		}
		else//栈不为空
		{
			if( st.top()!=output[i] )//不是栈顶元素,就从待入栈中找
			{
				while(j<n && input[j]!=output[i])
					st.push(input[j++]);
				if(j==n)
					return 0;//没有找到output[i],不符合
			}
			else//如果是栈顶元素,出栈
			{
				st.pop();
			}
		}
			
	}
	
	return 1;//出栈结束了
}
void main()
{
	int input[5]={1,2,3,4,5};
	int output[5]={4,5,3,1,2};
	cout<<"结果 "<<check(input,output,5)<<endl;
	system("pause");
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值