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

来源:互联网 发布:安卓机顶盒修改mac 编辑:程序博客网 时间:2024/05/16 15:46

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


原创粉丝点击