對乙個空棧進行 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 ...