驗證棧序列

2021-10-24 15:40:28 字數 2228 閱讀 7252

對乙個空棧進行 push 和 pop 操作各 n 次,使得 1-n 每個數都被 push 和 pop 一次,n 次 push 的數按照順序形成排列 a,n 次 pop 的數按照順序形成排列 b,此時稱 a 和 b 互為「棧轉化序列」。

input

612

3456

5643

21

output

true
explanation

push(1

),push(2

),push(3

),push(4

),push(5

),pop(5)

,push(6

),pop(6)

,pop(4

),pop(3)

,pop(2

),pop(

1)

因進棧和出棧的方式千變萬化,若實現每一種情況,再與第二個序列進行比較不太現實。因此需要找到棧轉化序列的規律。

比如以i元素為基準,若j元素比i元素後進棧,那麼j元素可出現在i元素後面的任意乙個位置。若j元素比i先進棧,那麼需要看看j元素後是否有比j元素後進棧的元素,若有,則該序列不是乙個棧轉化序列。

例:

6

a b c d e f

e f d c a b

//i = e

//j = a 是此時在原序列最小的位置

//j = b 此時b原序列的位置比a原序列的位置要大

//所以第2個序列不是棧轉化序列

#include

using

namespace std;

intmain()

, b[

100]=;

cin >> n;

for(

int i =

0; i < n; i++

)for

(int i =

0; i < n; i++

)for

(int i =

0; i < n -

1; i++

)else}}

} cout <<

"true"

<< endl;

return0;

}

1.第1個陣列在輸入時將位置與元素反過來,目的是方便後面遍歷b陣列元素時對a中位置進行查詢;

a[temp]

= i;

2.若j在a中位置比i在a中位置大,則j元素位置合適;

if

(a[b[i]

]> a[b[j]

])

3.max在這裡表示i後面最大的元素位置(小於i位置),若i後面有元素位置大於max則說明該元素後進棧,無法在後面輸出;

if

(a[b[j]

]> max)

else

4.做外迴圈的意義:僅遍歷1次b陣列無法判斷以下情況,因為a後面的元素位置都比a的位置大。

6

a b c d e f

a f e d c d

思路:

模擬演算法。把pushed陣列的元素逐個壓棧,當棧頂元素等於popped陣列中第乙個元素的時候,就讓棧頂元素出棧,這個時候再用popped陣列的第2個元素和棧頂元素比較,如果相同繼續出棧,最後判斷棧是否為空即可。

c++**:

class

solution

}return

(s.empty()

?true

:false);

}};

highlight:

這個表示式你還會用嗎?

return

(s.empty()

?true

:false

);

驗證棧序列

給定 pushed 和 popped 兩個序列,只有當它們可能是在最初空棧上進行的推入 push 和彈出 pop 操作序列的結果時,返回 true 否則,返回 false 0 pushed.length popped.length 1000 0 pushed i popped i 1000 push...

驗證棧序列

驗證棧序列 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如,序列 是某棧的壓棧序列,序列 是該壓棧序列對應的乙個彈出序列,但 就不可能是該壓棧序列的彈出序列。示例 1 輸入 pushed 1,2,3,4,5 popped 4,5...

946 驗證棧序列

給定pushed和popped兩個序列,只有當它們可能是在最初空棧上進行的推入 push 和彈出 pop 操作序列的結果時,返回true 否則,返回false。示例 1 輸入 pushed 1,2,3,4,5 popped 4,5,3,2,1 輸出 true 解釋 我們可以按以下順序執行 push ...