演算法程式設計 遞迴實現棧的逆序

2021-10-13 04:57:04 字數 1476 閱讀 7545

給定乙個棧,在不使用額外資料結構和逆序類庫的條件下實現棧內元素的逆序。例如入棧的順序為12345,逆序後對應的出棧的順序也是12345.c++原始碼:

//題目:給定乙個棧,使用遞迴方法將其逆序;

#include

#include

using

namespace std;

//核心演算法:遞迴本質上是乙個棧,其依次將棧s的棧頂pop後push在計算機記憶體的棧中,直到s棧空後,再從記憶體中

//的棧pop並重新push到s中

//該函式目標是獲取棧s的棧底,並將棧底去除

intget_and_remove_last

(stack<

int>

&s)else

}//演算法入口,遞迴地對當前的s獲取棧底並移除棧底,然**棧

void

reverse_stack

(stack<

int>

&s)}

intmain()

reverse_stack

(s);

cout<<

"\nreverse pop order:\n"

;while

(!s.

empty()

)system

("pause");

return0;

}

原理講解:我們知道棧資料結構是先進後出的,因此如果實現逆序,傳統的方法可以對現有的棧,依次將棧頂元素出棧併入棧至乙個新的棧,這樣可以實現逆序的輸出,但其不符合題目要求,因此我們選擇使用遞迴的方法,因為遞迴的本質就是計算機記憶體內實現乙個棧

因此,對於乙個棧 s

ss(由棧頂到棧底順序為321為例),我們對棧的操作只能是對棧頂進行pop或push,而如果實現逆序,則必須得獲得棧底的元素,並將棧底的元素入棧到棧頂。因此整個過程可以分為3個子步驟,分別是:

程式呼叫的流程圖如圖所示:

實現這個過程主要由兩個函式,如下面的**:

int

get_and_remove_last

(stack<

int>

&s)else

}

這個函式的目的是遞迴的將當前棧 s

ss 的棧底元素取出並刪除。假設當前棧(棧頂到棧底的順序)為321,執行一次後返回值為棧底1,此時棧變為32。下面這個函式則是將這個棧底元素遞迴的存入計算機記憶體中的棧,先取出來的棧底元素**棧,因此實現了逆序。

void

reverse_stack

(stack<

int>

&s)}

只使用遞迴實現棧的逆序操作

2017 06 23 20 36 02 解決該問題的核心其實是如果通過遞迴演算法來獲取棧底元素,也就是getlast函式的演算法。getlast演算法實現 首先獲得stack的top元素,如果當前棧為空,則直接返回結果 如果當前棧不為空,則遞迴的求解棧的棧底元素,之後再把當前的pop出來的元素壓棧 ...

用遞迴操作逆序棧 遞迴

乙個棧依次壓入1,2,3,4,5那麼從棧頂到棧底分別為5,4,3,2,1。將這個棧轉置後,從棧頂到棧底為1,2,3,4,5,也就是實現了棧中元素的逆序,請設計乙個演算法實現逆序棧的操作,但是只能用遞迴函式來實現,而不能用另外的資料結構。給定棧的大小n和乙個棧stack,請返回逆序後的棧。測試樣例 5...

單鏈表的逆序實現,遞迴和非遞迴演算法

這個也是很常見的面試題目。剛開始見過,開了一下別人寫的以為理解了,讓我自己寫,我才發現原來裡面的細節是很多的,可以說,你也許大概懂演算法在幹什麼,可是,你若如果不注意細節,根本體會不到演算法裡面的每一行的意思,今天就是看了別人乙個演算法,被誤導了,怎麼都沒理解他的意思。結果看了10幾篇,果然他裡面漏...