出棧序列的可能性判定問題(PAT1051)

2021-06-16 12:58:36 字數 1383 閱讀 6701

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++實現**如下:

#include

intm,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...