程式設計題目 棧的 push pop 序列

2022-05-18 10:51:34 字數 2495 閱讀 9844

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序列強製成0 1 2 3 4...一樣,這樣push序列就是從小到大排列的了。

然後,觀察從小到大排列的push序列,其合理的pop序列的特點。

4 5 3 2 1

記錄第1個數字 並查詢遞增的數字 這裡是 4  5  他們是遞增的。

3 4 2 1 5

3 4 5 遞增的

發現只要這些數字符合遞增規律,那麼pop序列就是合理的。且這些序列就是新加入數字後開始彈出的值。

還是拿3 4 2 1 5舉例

3 是在壓入1 2 3後彈出的第乙個值

4 是在壓入4後彈出的第乙個值

5 是在壓入5後彈出的第乙個值

4 2 1這個遞減的序列表示,沒有壓入新值,一直在彈出。

即,有遞增序列表示有壓入新的值,遞減序列表示一直彈出。因為push序列時遞增的,故壓入的新值只能越來越大。

對於4、3、5、1、2

4 5 2 顯然不滿足遞增關係 即壓入5後不能再壓入2 不是合法的pop序列

注:我沒法證明,不知道是不是所有的都符合這個規律。誰能舉出反例嗎?

/*

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 序列。

start time = 16:15

end time = 17:20

*/#include

int * getlocation(int data, int * poplist, int

len)

return

null;

}bool ispop(int * pushlist, int * poplist, int

len)

else

}int increasenum2 = poplist[0

];

intincreasenum1;

for(int i = 1; i < len; i++)

}return

true;}

intmain()

;

int b[5] = ;

bool

is = ispop(a, b, 5

);

return0;

}

網上答案:網上的思路驚人的一致,都是直接的建乙個棧來模擬這個過程。比我的思路來的要好,計算少,又好理解。

如果我們希望pop的數字正好是棧頂數字,直接pop出棧即可;如果希望pop的數字目前不在棧頂,我們就到push序列中還沒有

* 被push到棧裡的數字中去搜尋這個數字,並把在它之前的所有數字都push進棧。如果所有的數字都被push進棧仍然沒有找到這

* 個數字,表明該序列不可能是乙個pop序列。

網上隨便找了個**,還沒驗證

//

棧的push、pop序列

#include

#include

const

int size=5; //

定義長度

using

namespace

std;

bool judge(int spush,int

spop)

ipush++;

}if(ipop==size) return

true

;

else

return

false;}

int main(void

)

棧的push pop序列

棧的push pop序列 輸入兩個整數序列。其中乙個序列表示棧的push 順序,判斷另乙個序列有沒有可能是對應的 pop順序。為了簡單起見,我們假設 push 序列的任意兩個整數都是不相等的。比如輸入的push 序列是1 2 3 4 5,那麼4 5 3 2 1就有可能是乙個 pop系列。因為可以有如...

棧的push pop序列

題目 輸入兩個整數序列。其中乙個序列表示棧的push順序,判斷另乙個序列有沒有可能是對應的pop順序。為了簡單起見,我們假設push序列的任意兩個整數都是不相等的。比如輸入的push序列是1 2 3 4 5,那麼4 5 3 2 1就有可能是乙個pop系列。因為可以有如下的push和pop序列 pus...

棧的PUSH POP序列

輸入兩個整數序列,其中乙個表示棧的push順序,判斷另乙個序列有沒有可能是對應的pop序列。下面使用乙個棧來模擬這個操作過程,棧頂元素等於出棧序列中的元素時出棧,不等於時入棧。如果棧正常pop直到為空,說明序列是對應的pop序列返回真,否則返回假 1 pst 為已經初始化的棧 2 input為輸入棧...