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。
题目:输入两个整数序列。其中一个序列表示栈的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;
}