使用两个stack对一个stack的内容进行反转

本文介绍了两种方法来反转一个栈内的元素。方法一是仅使用一个栈,通过递归将栈内元素依次出栈并重新入栈,达到反转效果。方法二是利用两个栈A和B,将A中的元素全部压入B,然后将B中的元素逐个弹出并压入A,完成反转操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

办法一(只采用一个stack), 通过递归实现:

// http://w...content-available-to-author-only...s.org/reverse-a-stack-using-recursion/
 
#include<iostream>
#include<stack>
using namespace std;
 
void printStack(stack<int> st)
{
    while(!st.empty()){
        cout<<st.top()<<" ";
        st.pop();
    }
    cout<<endl;
}
 //递归插入
void insertAtBottom(stack<int> &st, int data)
{
    if( (st.empty()) ){
        st.push(data);
    }
    else {
        int temp = st.top();
        st.pop();
        insertAtBottom(st, data);
        st.push(temp);
    }
}
 
void reverseStack(stack<int> &st)
{
    if( !(st.empty()) )
    {
        int temp = st.top();
        st.pop();
        reverseStack(st);
        insertAtBottom(st, temp);
    }
}
 
int main()
{
    stack<int> st ;
    st.push(4);
    st.push(3);
    st.push(2);
    st.push(1);
    printStack(st);
 
    reverseStack(st);
 
    printStack(st);
    return 0;
}
 
上述算法中, 递归玩之后有进入下一个递归, 将elements 放在stack中。
具体如下, 以4, 3, 2, 1顺序入栈:

reverseStack(1234) :

temp = 1,  reverseStack(234),  进入下一下function stack: temp = 2, reverseStack(34), 进入下一个stack frame: temp = 3, reverseStack(4), 接下来, temp = 4, reverse(empty), 接下来, 逐次放回上次递归调用。 insertAtBottom(st, 4), 由于st此时为空的, 直接入栈st = 4, 接下来, 返回上一层递归调用, insertAtBottom(st, 3), 由于此时st不为空, 所以4出栈, 变为空, 3入栈, 返回上一层, 4入栈, 这样st就变成了: st = 43, 一次类推, 最终, st = 4321, 这样就利用stack frame, 只需要一个stack就实现了反转了。


方法二: 现在当有两个stack的时候, A, B, 我们只需要采用递归的办法, 把A的内容复制到B中, 然后在将B的内容pop到A中, 即可实现反转了。

程序如下:

#include<iostream>
#include<stack>
using namespace std;

void printStack(stack<int> st)
{
    while(!st.empty()){
        cout<<st.top()<<" ";
        st.pop();
    }
    cout<<endl;
}


void reverseStack(stack<int> &st, stack<int> &st2)
{
    if( !(st.empty()) )
    {
        int temp = st.top();
        st.pop();
        reverseStack(st, st2);
        st2.push(temp);
    }
}

int main()
{
    stack<int> st, st2;
    st.push(4);
    st.push(3);
    st.push(2);
    st.push(1);
    printStack(st);

    reverseStack(st, st2);

    printStack(st);
    while(!st2.empty()) {
        st.push(st2.top());
        st2.pop();
    }
    printStack(st);
    return 0;
}

运行如下:



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值