栈的push、pop 序列测试

9 篇文章 0 订阅
9 篇文章 0 订阅
29.栈的push、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 序列。

题目来源:
微软等公司数据结构+算法面试100 题V0.1 版
http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html


分析:

利用一个栈来测试,顺序取pop序列中的元素,假如该元素在栈顶则弹出该元素,测试下一个元素,若不在栈顶则取push序列中的元素入栈,若push序列用光依然没有当前pop序列中的元素则说明不可能是对应序列,若pop序列所有元素都可以通过栈弹出,说明是对应序列。


// 输入两个整数序列。其中一个序列表示栈的push 顺序,
// 判断另一个序列有没有可能是对应的pop 顺序。
// 为了简单起见,我们假设push 序列的任意两个整数都是不相等的。
bool StackTest(int *push, int *pop, int n)
{
	stack<int> intstack;
	int i=0;	//pop index;
	int j=0;	//push index;
	while (i<n)
	{
		if(!intstack.empty()&&intstack.top()==pop[i])	//pop[i]在栈顶,直接出栈
		{
			i++;
			intstack.pop();
		}
		else if (j<n)							//pop[i]不在栈顶,将push进栈
		{
			intstack.push(push[j]);
			j++;
		}else									//已全部进栈
			return false;
	}

	return true;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值