詳解 02線性結構4 Pop Sequence

2021-10-07 15:33:46 字數 2977 閱讀 4359

譯文:

給定乙個堆疊,最多可以保留m個數字。 按1、2

、3,.

..,n

1、2、3,...,n

1、2、3,

...,

n的順序按n個數字,然後隨機彈出。 請確定給定的數字序列是否是堆疊的可能彈出序列。 例如,如果m為5,n為7,我們可以從堆疊中獲得1、2

、3、4

、5、6

、7

1、2、3、4、5、6、7

1、2、3、

4、5、

6、7,但不能獲得3、2

、1、7

、5、6

、4

3、2、1、7、5、6、4

3、2、1、

7、5、

6、4。

輸入格式:

每個輸入檔案包含乙個測試用例。 對於每種情況,第一行包含3個數字(全部不超過1000個):m(堆疊的最大容量),n(彈出序列的長度)和k(要檢查的彈出序列的數量)。 然後是k行,每行包含乙個由n個數字組成的彈出序列。 一行中的所有數字都用空格分隔。

輸出格式:

對於每個彈出序列,如果確實是堆疊可能的彈出序列,則在一行中列印「是」,否則列印為「否」。

輸入例:

575

1234

5673

2175

6476

5432

1564

3721

1765

432

輸出例:

yes

nono

yesno

解題思路:

本題是關於資料結構中的棧的題目,棧最核心的屬性就是它的先入後出,這一點也是解決本題的關鍵,因為本題的入棧順序是按照1,2

,3,.

..,n

1,2,3,...,n

1,2,3,

...,

n的順序,因此假設出棧的數字的是i(1

<=i

<=n

)i(1<= i <=n)

i(1<=i

<=n

),那麼必定有1,2

,3,.

..,i

−1

1,2,3,...,i-1

1,2,3,

...,

i−1已經不在棧中了。

換個方法解釋就是:假設儲存資料的為棧a,需要判斷真假的為出棧序列b,那麼從左往右遍歷序列b,每次遍歷到的b中的出棧資料要大於等於a的棧頂元素,因為按照1,2

,3,.

..,n

1,2,3,...,n

1,2,3,

...,

n的順序入棧的話,棧頂的元素一定是當前棧中最大的元素,因此已經出棧的元素必定大於等於棧頂這個最大的元素。若出棧的資料大於棧頂元素,則說明棧a並未有足夠的輸入進行出棧操作,還需要繼續push,當push完成後則判斷當前棧a的長度是否超過題目允許的最大長度m,若符合,則進行pop操作,即將棧頂減1,並且繼續push乙個更大的數,繼續遍歷。

基於此考慮,建立乙個空棧,按照1,2

,3,.

..,n

1,2,3,...,n

1,2,3,

...,

n的順序入棧,在入棧的過程中與所需要判斷的出棧結果進行比較,看是否存在違反規則的情況,如果存在,則輸出no,入棧結束後沒有出現違反規則的情況則輸出yes

思路到這介紹完畢,接下來是程式,程式中關鍵的部分都已注釋。

完整程式如下:

#include

#define max_size 1000

//資料的最大長度

void

check

(int m,

int n,

int k)

;int

main()

//判斷輸入是否符合規則

void

check

(int m,

int n,

int k)

, top =-1

, num =1;

push[

++top]

= num;

for(j=

0; j)//捕獲每行的n個輸入

scanf

("%d"

,&pop[j]);

for(j=

0; j)while

(pop[j]

>push[top]

) push[

++top]

=++num;

if(top>=m)

if(pop[j]

== push[top]

) top--;if

(top<0)

push[

++top]

=++num;}if

(flag)

printf

("no\n");

else

printf

("yes\n");

}}

手工碼字碼**,如果有幫助到你的話留個贊吧,謝謝。

以上。

02 線性結構4 Pop Sequence

題意 第一行輸入三個整數m n k,分別代表棧容量,進棧序列長度,待核實的出棧序列行數 隨後k行輸入出棧序列,要求核實其是否是乙個可能的出棧序列 分析 根據題意,出棧元素只能是從1到n 可以根據當前的出棧元素,判斷棧內剩餘元素數量以及棧頂元素 又通過剩餘元素數量及棧頂元素判斷下乙個出棧元素是否符合棧...

線性結構練習 4

給定乙個包括 n 個整數的陣列 nums 和 乙個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。例如,給定陣列 nums 1,2,1,4 和 target 1.與 target 最接近的三個數的和為 2.1 2...

02 線性結構3 Pop Sequence

題目有一點要注意,就是樣例的第五組 1 7 6 5 4 3 2 1可以先出,23456入棧之後,7不能入棧了,所以是不行的 杭電1022有差不多的圖可以理解一下 用stl寫的,c太麻煩不想寫 include include include include include include using ...