設計乙個有getmin功能的棧
實現乙個特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小元素的操作。
1.pop、push、getmin操作的時間複雜度都是o(1)。
2.設計的棧型別可以使用現成的棧結構。
在設計時,我們使用兩個棧,乙個棧用來儲存當前棧中的元素,其功能和乙個正常的棧沒有區別,這個棧記為stackdata;另乙個棧用於儲存每一步的最小值,這個棧記為stackmin。具體的實現方式有兩種。
第一種設計方案
假設當前資料為newnum,先將其壓入stackdata。然後判斷stackmin是否為空:
— 如果為空,則newnum也壓入stackmin。
— 如果不為空,則比較newnum和stackmin的棧頂元素中哪乙個更小:
ø 如果newnum更小或兩者相等,則newnum也壓入stackmin;
ø 如果stackmin中棧頂元素小,則stackmin不壓入任何內容。
舉例:依次壓入3、4、5、1、2、1的過程中,stackdata和stackmin的變化如圖1-1所示。
先在stackdata中彈出棧頂元素,記為value。然後比較當前stackmin的棧頂元素和value哪乙個更小。
通過上文提到的壓入規則可知,stackmin中存在的元素是從棧底到棧頂逐漸變小的,stackmin棧頂的元素既是stackmin棧的最小值,也是當前stackdata棧的最小值。所以不會出現value比stackmin的棧頂元素更小的情況,value只可能大於或等於stackmin的棧頂元素。
當value等於stackmin的棧頂元素時,stackmin彈出棧頂元素;當value大於stackmin的棧頂元素時,stackmin不彈出棧頂元素,返回value。
很明顯可以看出,壓入與彈出規則是對應的。
由上文的壓入資料規則和彈出資料規則可知,stackmin始終記錄著stackdata中的最小值。所以,stackmin的棧頂元素始終是當前stackdata中的最小值。
假設當前資料為newnum,先將其壓入stackdata。然後判斷stackmin是否為空。
如果為空,則newnum也壓入stackmin; 如果不為空,則比較newnum和stackmin的棧頂元素中哪乙個更小。
如果newnum更小或兩者相等,則newnum也壓入stackmin; 如果stackmin中棧頂元素小,則把stackmin的棧頂元素重複壓入stackmin,即在棧頂元素上再壓入乙個棧頂元素。
在stackdata中彈出資料,彈出的資料記為value;彈出stackmin中的棧頂,返回value。
很明顯可以看出,壓入與彈出規則是對應的。
由上文的壓入資料規則和彈出資料規則可知,stackmin始終記錄著stackdata中的最小值,所以stackmin的棧頂元素始終是當前stackdata中的最小值。
返回棧中最小元素
實現乙個特殊的棧,在實現棧的基本功能的基礎上,再實現返 回棧中最小元素的操作。要求 pop push getmin操作的時間複雜度都是o 1 設計的棧型別可以使用現成的棧結構。public static class stackbymin public void push int newnum els...
用遞迴操作逆序棧 遞迴
乙個棧依次壓入1,2,3,4,5那麼從棧頂到棧底分別為5,4,3,2,1。將這個棧轉置後,從棧頂到棧底為1,2,3,4,5,也就是實現了棧中元素的逆序,請設計乙個演算法實現逆序棧的操作,但是只能用遞迴函式來實現,而不能用另外的資料結構。給定棧的大小n和乙個棧stack,請返回逆序後的棧。測試樣例 5...
用遞迴函式和棧操作逆序棧
乙個棧依次壓入1,2,3,4,5那麼從棧頂到棧底分別為5,4,3,2,1。將這個棧轉置後,從棧頂到棧底為1,2,3,4,5,也就是實現了棧中元素的逆序,請設計乙個演算法實現逆序棧的操作,但是只能用遞迴函式來實現,而不能用另外的資料結構。給定乙個棧stack以及棧的大小top,請返回逆序後的棧。測試樣...