返回棧中最小元素 遞迴逆序棧

2021-10-03 19:26:48 字數 2664 閱讀 3296

設計乙個有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,請返回逆序後的棧。測試樣...