程序员面试题精选--栈的push、pop序列判定
来源:互联网 发布:安卓机顶盒修改mac 编辑:程序博客网 时间:2024/05/16 15:46
题目:输入两个整数序列。其中一个序列表示栈的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;}
- 程序员面试题精选--栈的push、pop序列判定
- 程序员面试题精选100题(24)-栈的push、pop序列
- 程序员面试题精选100题(24)-栈的push、pop序列
- 程序员面试题精选100题(24)-栈的push、pop序列
- 程序员面试题精选100题(24)-栈的push、pop序列[数据结构]
- 程序员面试题精选100题(24)-栈的push、pop序列
- 程序员面试题精选100题(24)-栈的push、pop序列[数据结构]
- 程序员面试题精选100题(24)-栈的push、pop序列[数据结构]
- 程序员面试题精选(24):栈的push、pop序列
- 面试题14 - 栈的 push, pop 序列 【栈】
- 25. 微软面试题:栈的push、pop序列(栈)
- 微软,Google面试题 (24) —— 栈的push、pop序列
- 剑指Offer---面试题22:栈的push,pop序列问题
- 程序员面试题100题第24题——判断是否是push、pop序列
- 【经典面试题】是否栈的push,pop结果
- 栈的push、pop序列
- 栈的push,pop序列
- 栈的push、pop序列
- jdk无法卸载 或 误删除安装目录导致无法卸载完全
- LPI - Exam 101: Detailed Objectives
- 二叉树
- XX公司信息化建设草案
- Android:android.git.kernel.org 无法访问时下载源代码的解决方法
- 程序员面试题精选--栈的push、pop序列判定
- 一次血泪教训引发的构思
- android path对象使用方法与Region.Op的解释
- C++中虚析构函数的作用
- VB.Net程序设计:ListBox拖动排序两个ListBox的操作
- 1235
- poj 1804 Brainman(归并)
- Android之PreferenceActivity
- 图像特征提取综述