出棧的合法性檢測

2021-08-11 16:35:35 字數 1325 閱讀 5181

對於乙個給定的入棧順序,可能的出棧順序會有很多,但是肯定都要遵循棧「後進先出」的特點,那麼怎麼進行合法性檢測呢?

演算法思想如下:

定義變數inindex標記入棧序列的當前位置,定義outindex標記出棧序列的當前位置

對inindex和outindex處的數進行比較,如果相同,同時往後走。

如果不相同,則出棧序列去和輔助棧的棧頂的資料比較,如果相同,則pop掉棧頂,++outindex,然後繼續和棧頂比較,如果相同,只要入棧佇列沒走完,就將資料放入輔助棧。

如果入棧序列已經走完了,讓出棧序列依次棧頂資料比較,只要不匹配肯定是非法的。

圖示如下:

基於這樣的思想,可以寫出如下**:

#include

#include

using

namespace

std;

bool checkstack(vector

in, vector

out)

else

if (!s.empty() && out[outindex] == s.top())//如果入棧和出棧不匹配,出棧序列就去和棧頂比

}else

//當前不匹配,入棧的序列繼續往後走

if (inindex >= in.size())//如果入棧序列已經走完,出棧序列和棧頂元素一一比較

//如果和棧中比較完,兩個序列都走完了,即表明順序合法

if (inindex == in.size() && outindex == out.size())

//說明出棧的序列中和棧頂有不匹配的數,即出棧順序不合法

else}}

}int main()

; vector

out = ;

cout

#if 1

vector

in = ;

vector

out = ;

cout

<< checkstack(in, out) << endl;

#endif

#if 0

vector

in = ;

vector

out = ;

cout

<< checkstack(in, out) << endl;

#endif

system("pause");

return

0;}

如有錯誤的地方,還望更正!

出棧合法性

題目描述 已知自然數1,2,n 1 n 100 依次入棧,請問序列c1,c2,cn是否為合法的出棧序列。輸入包含多組測試資料。每組測試資料的第一行為整數n 1 n 100 當n 0時,輸入結束。第二行為n個正整數,以空格隔開,為出棧序列。對於每組輸入,輸出結果為一行字串。如給出的序列是合法的出棧序列...

出棧的合法性

1788 出棧合法性 時間限制 1 sec 記憶體限制 32 mb 提交 153 解決 60 提交 狀態 討論版 題目描述 已知自然數1,2,n 1 n 100 依次入棧,請問序列c1,c2,cn是否為合法的出棧序列。輸入 輸入包含多組測試資料。每組測試資料的第一行為整數n 1 n 100 當n 0...

出棧序列的合法性

給定乙個最大容量為 m 的堆疊,將 n 個數字按 1,2,3,n 的順序入棧,允許按任何順序出棧,則哪些數字序列是不可能得到的?例如給定 m 5 n 7,則我們有可能得到,但不可能得到。輸入格式 輸入第一行給出 3 個不超過 1000 的正整數 m 堆疊最大容量 n 入棧元素個數 k 待檢查的出棧序...