用递归反转stack里面的元素

本文介绍如何仅使用基本的Stack操作(empty, push, pop)和递归来反转Stack中的元素。通过两个递归函数,第一个函数自顶向下遍历Stack直至空,第二个函数自底向上将元素重新插入Stack底部。详细代码展示了解决方案。" 89459873,8387312,jQuery基础操作:DOM对象、选择器与事件,"['jQuery', '前端开发', 'DOM操作', '表单处理']

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

Reverse a stack using recursion

问题描述
反转stack里面的元素,不能用while, for这样的循环机构,只允许用stack的一些操作,如:
empty(S)
push(S)
pop(S)

solution
解决这个问题需要用到两个递归函数:
第一个递归函数从通配开始向下遍历stack中的每一个元素,直到stack为空

S1 –>S2–>S3–>S4–>S5–>
1 <–
2
3
4
5
1
2<–
3
4
5
1
2
3<–
4
5
1
2
3
4<–
5
1
2
3
4
5<–

第二个递归函数从stack的最后一个元素开始向上依次将每个元素插入到stack的底部:

S10<–S9<–S8<–S7<–S6
5
4
3
2
1
1
5
4
3
2
1
2
5
4
3
1
2
3
5
4
1
2
3
4
5

代码如下:

void insertBottom(Stack &stk, int val)
{
        if(stk.empty())
        {
                stk.push(val);
                return;
        }else{
                int temp = stk.top();
                stk.pop();
                insertBottom(stk, val);
                stk.push(temp);
                return;
        }
}

void reverse(Stack &stk)
{
        if(!stk.empty())
        {
                int temp = stk.top();
                stk.pop();
                reverse(stk);
                insertBottom(stk, temp);
        }
        return;
}

完整代码:

#include <iostream>

using namespace std;

class Stack{
public:
        Stack(int n){
                num = n;
                arr = new int[n]();
                t = -1;
        }

        ~Stack(){
                delete [] arr;
        }

        bool empty()
        { return t<0; }

        void push(int val)
        {
                t++;
                if(t >= num)
                {       cout<<"the stack is full"<<endl;
                        return; 
                }else
                        arr[t] = val;
                return;
        }

        void pop()
        {
                if( t<0 )
                {       cout<<"the stack is empty, can't pop'"<<endl;
                        return;
                }else
                        t--;
        }

        int top()
        {
                if(t<0)
                {       cout<<"the stack is empty";
                        return -1;
                }else
                        return arr[t];
        }

public:
        int *arr;
private:
        int num;
        int t;
};

void print(Stack &stk)
{
        if(!stk.empty())
        {
                int temp = stk.top();
                cout<<temp;
                stk.pop();
                print(stk);
                stk.push(temp);
        }else{
                cout<<endl;
        }
        return;
}

void insertBottom(Stack &stk, int val)
{
        if(stk.empty())
        {
                stk.push(val);
                return;
        }else{
                int temp = stk.top();
                stk.pop();
                insertBottom(stk, val);
                stk.push(temp);
                return;
        }
}

void reverse(Stack &stk)
{
        if(!stk.empty())
        {
                int temp = stk.top();
                stk.pop();
                reverse(stk);
                insertBottom(stk, temp);
        }
        return;
}


int main()
{
        int arr[] = {6,5,4,3,2,1};
        Stack stk(10);
        for(int i = 0; i<6; ++i)
                stk.push(arr[i]);
        print(stk);
        reverse(stk);
        print(stk);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值