數據結構:同一組不重複輸入序列執行不同的出入棧組合操作,所得結果也可能相同?——對此問題的探討

題源:《數據結構1800題》第四版 P45

1. 判斷題:同一組不重複輸入序列執行不同的出入棧組合操作,所得結果也可能相同。(北京郵電大學,2005)

答案:√

分析:這道題之前已經有人討論過,可以參考:《V2EX:一個算法題請教…》,看來確實有一些爭議,下面以我的理解分析一下。

首先,本題 並未說明說初態和終態是否爲空,而在 終態棧非空 的情況下,也就是說,並不需要所有元素都出棧,這樣的話,留給我們的發揮空間就比較大了。

例如,輸入序列爲:1 2 3 4

操作①:push pop,輸出序列:1
操作②:push pop push push,輸出序列:1

你看,確實是兩種不同的操作序列吧,也確實得到了相同的輸出序列吧。那麼本題的這句話確實是正確的,書上給的答案是沒問題的。


2. 判斷題:即使對不含相同元素的同一輸入序列進行兩組不同的合法的入棧和出棧組合操作,所得的輸出序列也一定相同。(北京郵電大學,1999;中國海洋大學,2005)

答案:×

分析:本題在答案上沒有什麼爭議,肯定是選 ×,就不舉例說明了。但是估計很多人看到 也一定相同 這個描述會感到疑惑,給人感覺如果寫成 可能相同 ,這句話就應該是對的。實際上如果改成 可能相同 的話,本題就與上一題一樣了。再一次印證了上一題答案是 √。


3. 應用題:

假設以 S 和 X 分別表示入棧和出棧的操作,則初態和終態均爲空棧的入棧和出棧的操作序列可以表示爲僅由 S 和 X 組成的序列。稱可以操作的序列爲合法序列(例如,SXSX爲合法序列,SXXS爲非法序列)(東南大學,1992)

(1)試給出區分給定序列爲合法序列或非法序列的一般準則

(2)兩個不同的合法(棧操作)序列(對同一輸入序列)能否得到相同的輸出元素(注意:在此指的是元素實體,而不是值)序列?如能得到,請舉例說明。

《1800題》書上的答案:

在這裏插入圖片描述
對於以上答案第(2)問我不認同,因爲題目中已經明確說明了是 對同一輸入序列,但答案說的是 兩個不同的輸入序列,明顯是答非所問了。

一個在我看來較爲合理的解答:

(1)區分準則:

  • 給定序列中 S 的個數和 X 的個數相等
  • 從給定序列開始,到給定序列中的任一位置,S 的個數要大於等於 X 的個數。

(2)不能得到相同的輸出元素序列。證明過程如下:

思路來源:《數據結構習題集》答案解析-嚴蔚敏吳偉民版,第3章 棧和隊列

設兩個合法序列爲:

T1 = S……X……S……
T2 = S……X……X……

假定前 n 個操作都相同,從第 n+1 個操作開始,爲序列不同的起始操作點。由於前 n 個操作相同,故此時兩個棧(不妨爲棧 A、B)的存儲情況完全相同,假設此時棧頂元素均爲 a。

第 n+1 個操作不同,不妨 T1 的第 n+1 個操作爲 S,T2的第 n+1 個操作爲 X。T1 爲入棧操作,假設將 b 壓棧,則 T1 的輸出順序一定是先 b 後 a;而 T2 將 a 退棧,則其輸出順序一定是先 a 後b。

由於 T1 的輸出爲……ba……,而 T2 的輸出順序爲……ab……,說明兩個不同的合法棧操作序列的輸出元素的序列一定不同。