問題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 棧為空,棧頂元素與出棧次序索引標記位置元素值不相等,入棧 入棧...