不用額外的空間顛倒棧你能夠做到嗎?

2021-09-30 15:06:52 字數 1213 閱讀 7821

題目:用遞迴顛倒乙個棧。例如輸入棧,1在棧頂。顛倒之後的棧為,5處在棧頂。

分析:乍一看到這道題目,第一反應是把棧裡的所有元素逐一pop出來,放到乙個陣列裡,然後在陣列裡顛倒所有元素,最後把陣列中的所有元素逐一push進入棧。這時棧也就顛倒過來了。顛倒乙個陣列是一件很容易的事情。不過這種思路需要顯示分配乙個長度為o(n)的陣列,而且也沒有充分利用遞迴的特性。

我們再來考慮怎麼遞迴。我們把棧看成由兩部分組成:棧頂元素1和剩下的部分。如果我們能把顛倒過來,變成,然後在把原來的棧頂元素1放到底部,那麼就整個棧就顛倒過來了,變成。

接下來我們需要考慮兩件事情:一是如何把顛倒過來變成。我們只要把看成由兩部分組成:棧頂元素2和剩下的部分。我們只要把先顛倒過來變成,然後再把之前的棧頂元素2放到最底部,也就變成了。

至於怎麼把顛倒過來……很多讀者可能都想到這就是遞迴。也就是每一次試圖顛倒乙個棧的時候,現在棧頂元素pop出來,再顛倒剩下的元素組成的棧,最後把之前的棧頂元素放到剩下元素組成的棧的底部。遞迴結束的條件是剩下的棧已經空了。這種思路的**如下:

假設我先拿int為例子吧

// reversestack3.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include

#include

using namespace std;

/*if(stack.empty())

else

*/void addtobutton(stack& stack,int data)

else

}void reversestack(stack& stack)

}int _tmain(int argc, _tchar* ar**)

;stackt;

for (int i=0;i<5;i++)

reversestack(t);

while (!t.empty())

else

*/void addtobutton(stack& stack,int data)

else }

void reversestack(stack& stack) }

int _tmain(int argc, _tchar* ar**)

; stackt;

for (int i=0;i<5;i++)

reversestack(t);

while (!t.empty())

{ cout<

翻轉字串 不用額外的記憶體空間

給定乙個字串,逐個翻轉字串中的每個單詞。說明 單詞的構成 無空格字母構成乙個單詞 樣例 給出s the sky is blue 返回 blue is sky the 使用std string的find first of,以 為引數,將s分割成多個單詞並推進堆疊中,然後利用堆疊的先進後出的特點,以彈出...

layout weight 額外空間的分配

這裡主要從寬度的討論layout weight layout weight 是用來對總的額外寬度的分配的權重,把各個子view分配到的額外寬度再加上原來的寬度,就是最後的寬度大小了。這裡關鍵在於額外寬度的計算的方法,總額外寬度是這樣計算的 父寬度 減去 各個子view的寬度之和 每個子view分配到...

顛倒棧中元素 棧的逆置

思路 1.使用遞迴pop出棧中元素,直到棧中元素只剩下乙個元素 2.當前第一次遞迴返回的時候,棧中有2個元素,我們再利用另乙個遞迴函式putitem把兩個元素逆置 3.以此遞迴下去,直到棧中元素全部逆置。過程如下 1 1 2,3,4 第乙個遞迴不斷出棧,第一次滿足返回條件時,棧中元素只有 1 2 回...