程序员面试题精选--栈的push、pop序列判定

题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。

比如输入的push序列是12345,那么45321就有可能是一个pop系列。因为可以有如下的pushpop序列:push 1push 2push 3push 4poppush 5poppoppoppop,这样得到的pop序列就是45321。但序列43512就不可能是push序列12345pop序列。

思路: 1、建立一辅助栈;

2、进入循环,若栈为空,压入一元素;

3、依次取pop序列一元素,与栈顶元素比较。若相等,则将栈顶元素弹出;若不相等,将push序列下一元素压栈。

4、在步骤3中需判定:若push序列剩余元素全部压入栈,栈顶元素也不可能与pop序列当前元素相等,此时函数返回,pop序列不合法;若非,回到步骤2.

5、若上述循环正常退出,则此时栈必然空,说明pop序列合法,函数返回,结束。


参考代码如下:

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

template <typename T>
bool IsPossiblePopOrder(const T *push, const T *pop, unsigned int length)
{
	unsigned int i = 0;
	unsigned int j = 0;
	stack<T> mystack;
	
	while(j<length)	 
	{// 此循环若正常退出,则说明POP序列合法
		
		if(mystack.empty())
		{
			mystack.push(push[i]);
			i++;
		}
		
		T top = mystack.top();	//获取当前栈顶元素 
		
		//比较POP序列元素与栈顶元素是否相等,若相等,则将其弹栈;若不相等,则将PUSH序列下一元素压栈
		while(pop[j]!=top && i<length)	 
		{
			mystack.push(push[i]);
			i++;
			top = mystack.top();
		}
		if(pop[j] == top)
		{
			j++;
			mystack.pop();
		}
		//说明对于POP序列中的一个值,即使PUSH序列剩余元素全部压入栈,也不可能得到,此时函数返回,POP序列不合法
		else if(i==length)	 
			return false;
	}
	return true;	//此时栈必然为空 
}

int main()
{
	int push[5] = {1,2,3,4,5};
	int pop[5] = {4,5,3,2,1};
	bool result = IsPossiblePopOrder(push, pop, 5);
	if(result)
		cout<<"True, pop sequence is valid!"<<endl;
	else 
		cout<<"False, pop sequence is invalid!"<<endl;
	system("pause");	//DEV环境,些语句使黑框命令行不消失,若VC6.0,可去掉 
	return 0;
}

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值