pat1051:給定stack的容量,給定資料的入棧順序:從1開始的正整數序列,在允許隨機的出棧操作的情況下,要求判斷某齣棧序列是否可能。
比如,告知stack容量為5,入棧序列的最大值為7。有兩個序列需要判斷合理性:
要完成判定過程,常規思路是直接使用的stack資料結構模擬出棧序列做操作,然後判定是否會觸犯條件。但考慮到pat1051中時間限制只有10ms,雖然常規方法是線性的,似乎也無法保障(事實證明是錯誤的,用常規方法也能在pat上ac),我想到從序列本身的特性入手,找規律,於是有了一種效率更高的判定邏輯。
直接使用出棧序列指導stack模擬操作。判定條件有兩條:
演算法描述如下:
用游標記錄當前已知壓棧的最大資料cur。如果新的讀入資料tmp(即出棧序列中的某資料)大於cur,則將cur到tmp之間的資料順序壓入棧中,更新cur並執行檢查1;如果新的讀入資料tmp小於cur,則一定是直接出棧獲得的,執行檢查2。
如果能順利完成就是合理的,如果操作過程違背了一些規則,則判定為不合理。c++實現**如下:
#include#include
using
namespace
::std
;intm,
n,k,
tmp,
cur;
bool
flag
;stack
<
int>s;
intmain
()elses.
pop();}if
(flag
)printf
("yes\n"
);else
printf
("no\n"
);}}
實際上,在pat1051的環境下,由於入棧序列資料由小到大排列非常特殊,要通過出棧序列判定可能性是存在簡便思路的。
對比分析題中sample給出的序列,結合上面提到的兩條衝突條件入手分析:
c++實現**如下:
#includeintm,n
,k;int
max,
min,
tmp;
bool
flag
;int
main
()else}if
(flag
)printf
("yes\n"
);else
printf
("no\n"
);}}
在我的理解之中,經典的演算法、資料結構是在面對程式設計問題的解決過程中所抽象出的通用模型。而生活是多變的,並不像考試卷一樣簡單的套用數學題所能解決,很多情況下,程式設計問題也是如此。那麼除了這些經典的方法外,認真分析條件,並進行針對性的優化甚至重新設計就非常重要了。這裡僅僅是乙個小實踐。
可能的出棧序列問題
首先的前提是進棧一定是要按照順序進棧如1 2 3 4的順序,如果第乙個出的是4,那麼要依次先進棧1 2 3 4,然後出棧,這樣的話第乙個是4,沒有其他的元素可以再進棧了,所以只能按順序出棧,這樣出棧的順序就是4 3 2 1。假如出棧的順序是3 4 2 1,你就要先分析出3的情況,只有先將1 2 3入...
出棧順序的全部可能性公式 四 順序棧
棧的定義 限定僅在表尾進行插入和刪除操作的線性表。同時因為只能在表尾進行操作,所以棧又稱為後進先出的線性表。見下圖,淺灰色的元素後進入棧結構,出棧的時候卻是第乙個出去。我們針對棧結構元素的插入和刪除,分別叫做 push 壓棧和 pop 彈棧。既然棧是線性表,而線性表包括順序表和煉表,那麼同樣棧也包括...
棧問題 根據入棧序列,得出可能的出棧序列
根據入棧序列,得出可能的出棧序列 例如 輸入 a b 輸出 a進a出b進b出 ab a進b進b出a出 ba 輸入 a b c 輸出 a進a出b進b出c進c出 abc a進a出b進c進c出b出 acb a進b進c進c出b出a出 cba a進b進b出c進c出a出 bca a進b進b出a出c進c出 bac...