AcWing 42 棧的壓入 彈出序列

2021-09-12 04:33:54 字數 1076 閱讀 9774

題目描述:

輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。

假設壓入棧的所有數字均不相等。

例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。

樣例

輸入:[1,2,3,4,5]

[4,5,3,2,1]

輸出:true

分析:

本題為判斷某序列是否為棧混洗序列。我們知道,只要某序列中不存在「312」禁形即為合法的棧混洗。當然這題我們直接模擬棧混洗的過程即可解決。

方法一:

不用棧,使用雜湊map來標識各個元素的狀態:0-未入棧;1-已入棧;2-已出棧。然後人為的對序列進行遍歷,首先定義p指標指向入棧序列,向右移動直到找到第乙個等於出棧序列首位元素的元素,移動過程中將掃過的元素均入棧(設標識為1)。

在匹配下乙個出棧序列元素時,判斷該元素的狀態,未入棧p則右移,已入棧p則左移,並且將掃過的元素出棧(設標識為2)。如果出棧序列**現了標識為01以外的元素,則不匹配。

class solution 

m[pushv[p]] = 2;

continue;

}if(m[popv[i]] == 1)

m[pushv[p]] = 2;

continue;

}else

}return true;

}};

方法二:

用棧模擬棧混洗。

先將最先要入棧的元素入棧,然後判斷當前棧頂元素是否等於q指向的出棧序列元素,相等則出棧,q++,繼續判斷,不等則在繼續入棧,重複操作。

注意這題的邊界,不匹配時肯定是p最先用完,所以判斷p即可,最後p到達n,迴圈結束,棧空則說明棧混洗序列合法,否則不合法。

class solution 

if(++p < n) s.push(pushv[p]);

}if(s.empty()) return true;

return false;

}};

42 棧的壓入 彈出序列

本題只要考點在解題思路上 借用乙個輔助的棧,遍歷壓棧順序,先講第乙個放入棧中,這裡是1,然後判斷棧頂元素是不是出棧順序的第乙個元素,這裡是4,很顯然1 4,所以我們繼續壓棧,直到相等以後開始出棧,出棧乙個元素,則將出棧順序向後移動一位,直到不相等,這樣迴圈等壓棧順序遍歷完成,如果輔助棧還不為空,說明...

棧的壓入彈出序列

題目 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓棧序列,序列4,5,3,2,1是該棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。解答 可以用乙個輔助的棧來儲存入...

棧的壓入 彈出序列

輸入兩個整數序列,第乙個序列表示棧的壓入順序,判斷兩個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1 2 3 4 5是某棧的壓棧序列,序列4 5 3 2 1是該壓棧序列對應的乙個彈出序列,但4 3 5 1 2就不可能是該壓棧序列的彈出序列。bool ispoporder cons...