給定入棧序列判斷給定出棧序列是否合法

2021-07-07 01:26:42 字數 1325 閱讀 2319

題目

:輸入兩個整數序列。其中乙個序列表示棧的入棧順序,判斷另乙個序列有沒有可能是對應的出棧順序。

思路:用乙個輔助棧,將入棧序列按照某種順序入棧,看是否可以產生出棧序列即可。

1)如果當前棧為空,且入棧序列不空,則入棧序列的下乙個元素入棧;

2)如果當前輔助棧的棧頂元素不等於出棧序列的首元素,那麼入棧序列一直入棧,直到入棧序列為空。

3)如果當前輔助棧的棧頂元素等於出棧序列的首元素,那麼棧頂元素彈出,出棧序列第乙個元素移走;

4) 如果入棧序列為空,出棧序列第乙個元素仍然不等於棧頂元素,則表示2個序列是不匹配的。舉例:

棧的特點是後進先出,假設入棧的順序是  1 2 3 4 5,出棧的順序是:4 5 3 2 1,這樣操作的順序是:push 1, push 2,push 3,push 4,pop 4, push 5 , pop 5,pop 3, pop 2, pop 1。假設出棧的順序是4 5 3 1 2,這種順序是錯誤的,因為1比2先壓入棧,所以2的出棧順序應該是1之前,顯然出棧順序是錯誤的。下面使用程式進行驗證

**如下:

#include #include #include using namespace std;

//給定入棧序列判斷出棧序列是否合法,stkin表示入棧序列,stkout表示出棧序列

bool judgeislegal(char *stkin, char *stkout)

midstk.push(*stkin++);//入棧序列的第乙個元入棧

while(*stkout != '\0')

//如果棧頂元素和出棧序列第乙個元素一致,那麼就將棧頂元素出棧,並且匹配出棧序列下乙個元素

if(*stkout == midstk.top())

//如果入棧序列已為空,但是棧頂元素和出棧序列第乙個元素扔不一致,則說明這2個串不是匹配的。

if(*stkin == '\0' && midstk.top() != *stkout)

} return true;

}int main()

{ char *str ="12345";

char *str2 = "45312";

if (judgeislegal(str,str2))

{ cout<

執行結果

由入棧 出棧序列求所有出棧 入棧序列

給出乙個陣列,代表入棧順序,求所有出棧可能性?給出乙個陣列,代表出棧順序,求所有入棧可能性?這兩題解法相同,可利用全排列求出所有組合,再進行可能性分析。全排列 如下 public list permute int nums 這種方法是什麼意思呢?例如abc,在第0位有三種可能,axx,bxx,cxx...

如何根據入棧序列判斷可能的出棧序列

tx面試題 題目描述 輸入兩個整數序列,其中乙個序列表示棧的push 入 序列,判斷另乙個序列有沒有可能是對應的pop 出 序列。解答 假如輸入的push序列是 1 2 3 4 5,那麼3 2 5 4 1就可能是乙個pop序列,但是5 3 4 1 2就不可能是它的乙個pop序列了。構造乙個棧 cla...

檢驗入棧序列 出棧序列是否合法

題目 元素出棧 入棧順序的合法性。如 入棧的序列 1,2,3,4,5 出棧序列為 4,5,3,2,1 則合法。入棧的序列 1,2,3,4,5 出棧序列為 4,5,2,3,1 則不合法。思路 借用乙個輔助棧,先按照入棧順序push,直到棧頂元素和出棧序列相等就pop,以此類推,最後棧為空且兩個序列都被...