您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法面试题80道(29)

2016-03-14 10:54 148 查看
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序列。

思路:如果栈为空栈,或栈顶元素不等于pop序列的当前值,那么就将push序列的第一个元素放入栈顶,push序列指针后移。

如果栈顶元素等于pop序列的当前值,弹出栈顶元素并将pop指针后移。

#include<iostream>
#include<cstring>
#include<stdio.h>
#include<stack>
using namespace std;

bool hasPop(int in[],int out[],int length,int length2){
if(length2>length) return false;//out序列长度比in序列大,肯定不是
stack<int>s;
int pushnum=0,popnum=0;
bool flag=false;
while(pushnum!=length){//这里一定要是pushnum!=length
while(s.empty()||s.top()!=out[popnum]){
s.push(in[pushnum]);
pushnum++;
if(pushnum==length) break;//in序列循环完了,没有数可以进入栈,直接结束
}
while(!s.empty()&&s.top()==out[popnum]){
s.pop();
popnum++;
if(popnum==length2) break;//避免超出数组
}
//当pushnum==length时,只有popnum==length2才为真,不然为假,这里可以想想
if(popnum==length2) flag=true;
}
return flag;
}
int main(){
int in[]={1,2,3,4,5};
int out[]={4,5,3,2,1};
int length=sizeof(in)/(sizeof(in[0]));
int length2=sizeof(out)/sizeof(out[0]);
if(hasPop(in,out,length,length2)) cout<<"是的"<<endl;
else cout<<"不是"<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: