數據結構與算法面試題80道(29)


29.棧的pushpop序列             

題目:輸入兩個整數序列。其中一個序列表示棧的push順序,

判斷另一個序列有沒有可能是對應的pop順序。

為了簡單起見,我們假設push序列的任意兩個整數都是不相等的。 

 

比如輸入的push序列是12345,那么45321就有可能是一個pop系列。

因為可以有如下的pushpop序列:

push 1push 2push 3push 4poppush 5poppoppoppop

這樣得到的pop序列就是45321

但序列43512就不可能是push序列12345pop序列。

 

思路:如果棧為空棧,或棧頂元素不等於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; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM