資料結構 出棧順序有效性的判斷

2021-09-12 09:18:00 字數 2934 閱讀 1264

問題1:若元素 a,b,c,d,e,f 順序進棧, 則不准許的出棧順序是

a. d,c,e,b,f,a    b. c,b,d,a,e,f    c. b,c,a,e,f,d    d. a,f,d,e,c,b

答案:d

2.1 問題的解法

令 1,2,3,4,5,6… 分別對應著 a,b,c,d,e,f…, 對問題1我們有以下演算法

algorithm 1 判斷出棧順序有效性演算法

step 1: 記第乙個數為m。

step 2: 然後在後面的數中檢查比m小的數(可以沒有)是否是按逆序排列,如果是則把m劃掉,否則當前數列不是乙個有效的出棧序列並退出判斷流程。

step 3: 數列是否為空,如果不空則回到step1, 否則當前數列為有效出棧順序並結束判斷流程。

例如對於選項 a. d,c,e,b,f,a 其對應的數列為 4,3,5,2,6,1

step 1: 找到當前第乙個數為4

step 2: 4後面的比4小的數為 3,2,1,為逆序排列,劃掉4,現在數列為 3,5,2,6,1

step 3: 數列不空,回到step 1

step 1: 當前第乙個數為 3

step 2: 3 後面的數按逆序排列, 劃掉 3,現在數列為 5,2,6,1

step 3: 數列不空, 回到step 1

step 1: 當前第乙個數為 5

step 2: 5後面的比5小的數按逆序排列,劃掉 5,現在數列為 2,6,1

step 3: 數列不空,回到step 1

step 1: 當前第乙個數為 2

step 2: 2 後面比2 小的數按逆序排列,劃掉 2, 現在數列為 6,1

step 3: 回到step 3

step 1: 當前第乙個數為 6

step 2: 6後面比6小的數按逆序排列, 劃掉 6, 現在數列為 1

step 3: 當前數列不空回到 step 1

step 1: 當前第乙個數為 1

step 2: 1後面沒有數,劃掉 1

step 3: 數列為空,則當前為有效的出棧順序

對於選項 d, 簡化一下演算法執行格式,可得

1,6,4,5,3,2 —> 6,4,5,3,2 —> 由於比6 小的 4,5 沒有逆序排列,所以該序列不是有效的出棧序列。

2.2 演算法分析

首先回顧一下棧的定義,棧是先進後出(filo)的線性結構。這裡用反證明來證明演算法的有效性。令 1,2,3,…,n分別代表n個依次入棧的元素的序號,即序號為1的第乙個入棧,序號為n的最後乙個入棧,出棧順序未知。假設當第 m 個元素出棧時,且比第 m 個元素小的元素第 i,j,… (i < j < … ) 個元素尚未出棧,如果 i 比 j 先出棧,則按照棧的filo 性質, i 比 j 後進棧,但這與前面的對序號的解釋相矛盾。則第 m 個元素出棧時,序號比 m 小的元素的出棧順序一定按元素序號逆序進行,即 序號大的先出棧。

3.1 python 實現

def

check_out_stack

(in_stack_list, out_stack_list)

: item_dict =

while

len(out_stack_list)

>1:

first_item = out_stack_list[0]

# 獲取比 first_item 小的的元素

smaller_items =

[(i+

1,v,item_dict[v]

)for i,v in

enumerate

(out_stack_list[1:

])if v < first_item]

index =

[item[2]

for item in smaller_items]

for i in

range

(len

(index)-1

):if index[i]

- index[i+1]

<0:

return

false

# 去除第乙個元素

out_stack_list = out_stack_list[1:

]print

(out_stack_list)

return

true

測試:

in: check_out_stack(

['a'

,'b'

,'c'

,'d'

,'e'

,'f'],

['d'

,'c'

,'e'

,'b'

,'f'

,'a'])

# a[

'c',

'e',

'b',

'f',

'a']

['e'

,'b'

,'f'

,'a'][

'b',

'f',

'a']

['f'

,'a'][

'a']

out:

true

in: check_out_stack(

['a'

,'b'

,'c'

,'d'

,'e'

,'f'],

['a'

,'f'

,'d'

,'e'

,'c'

,'b'])

# d[

'f',

'd',

'e',

'c',

'b']

out:

false

資料結構 判斷棧的出棧順序是否合理

題目 設乙個棧的輸入序列為1,2,3 n,編寫演算法,判斷序列,p1,p2,pn是否是合理的棧輸出序列 思想 將預期的出棧順序用乙個輔助棧儲存起來,然後將元素按照入棧的順序依次存入,若元素等於輔助棧的棧頂元素,則可以不用存入 當做出棧一樣 然後考慮下乙個要入棧的元素,按照這樣的操作之後,等到所有元素...

判斷日期的有效性

方法描述 去除字串前後的所有空格 引數 str 字串 function trim str 方法描述 日期格式的校驗 如 2008 02 29或者2008 02 29等這樣的才算合法 引數 datastr 日期的字串 function validatedate datastr d d var day ...

元素出棧 入棧順序的合法性 資料結構

元素出棧 入棧順序的合法性。如入棧的序列 1,2,3,4,5 出棧序列為 4,5,3,2,1 test.c int teststackinandoutvalid int in,int insize,int out,int outsize 棧為空,棧頂元素與出棧次序索引標記位置元素值不相等,入棧 入棧...