2013-11-21 42 views
5

如何反向堆棧而不使用任何(額外)數據結構?任何建議或僞代碼都可能有幫助。我試圖找不到任何可行的解決方案。這裏的問題是我不知道堆棧的大小。如果我知道我可以至少繼續創造一些東西,請提前致謝。反向堆棧不使用任何數據結構

+0

由於棧本身是一個數據結構,你允許使用它嗎? – corsiKa

+3

你可以做什麼是彈出當前堆棧的所有元素,並將它們推送到另一個。我不是如果那會適合你。 – svs

+1

堆棧如何實現?如果它是您自己的鏈接列表實現,只需指向相反的方向。 – chill

回答

6

這可以通過雙遞歸來完成,如follows:

void insert_at_bottom(node **stack, int data) 
{ 
    if(isempty(*stack)){ 
      push(stack,data); 
      return; 
    } 
    int temp=pop(stack); 
    insert_at_bottom(stack,data); 
    push(stack,temp); 
} 


void rev_stack(node **stack) 
{ 
    if(isempty(*stack)) return; 
    int temp = pop(stack); 
    rev_stack(stack); 
    insert_at_bottom(stack,temp); 
} 
3

你可以很容易地使用遞歸來做到這一點。然後,您允許的最大堆棧大小將受最大遞歸深度限制。一些代碼:

public void reverse(Stack st) { 
    int m = (int)st.Pop(); 
    if (st.Count != 1) { 
     reverse(st); 
    } 
    Push(st , m); 
    } 

public void Push(Stack st , int a) { 
    int m = (int)st.Pop(); 
    if (st.Count != 0) { 
     Push(st , a); 
    } 
    else { 
     st.Push(a); 
     st.Push(m); 
    } 
}