對於乙個給定的入棧順序,可能的出棧順序會有很多,但是肯定都要遵循棧「後進先出」的特點,那麼怎麼進行合法性檢測呢?
演算法思想如下:
定義變數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 待檢查的出棧序...