您的位置:首页 > 职场人生

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

2011-10-02 17:38 288 查看
题目:输入两个整数序列。其中一个序列表示栈的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序列。

思路: 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐