用递归反转stack里面的元素

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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值