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; }