两个栈对元素进行升序排列

注:转自栈的面试题—对栈进行升序排列


题目描述

请编写一个程序,按升序对栈进行排序,要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。
vector数组numbers中的第一个元素就是栈顶元素,升序排列,即栈顶元素最大

解题思路

看到这个题,因为可以申请一个栈用来存放临时数据,所以我们可以这样想:
由于栈先进后出的特性,先将原来栈中的数据存放到临时数据栈中,并且保证临时栈中的数据是降序排列的,这一过程完成之后,再将临时数据栈中的元素依次push到返回栈中即可。

具体实现步骤:

(1)申请一个数据栈s用来存放numbers中的数据,再申请一个临时栈tmp用来存放临时数据
(2)比较s栈弹出的栈顶元素top与tmp的栈顶元素,并进行相应的操作,以确保tmp栈中的数据是降序的,具体比较过程如下:
当s栈不为空时:

条件具体操作
若tmp栈为空或者top<=tmp.top()就将top元素push到tmp栈中
若tmp栈不为空并且top>tmp.top()将tmp中比top小的元素都push到s栈中,最后再将top元素push到tmp栈中

(3)此时tmp栈中的栈顶元素为最小值,将tmp栈中的元素依次弹出到s栈中,再将s栈中的元素依次弹出并保存到一个vector数组中。

操作演示图:

在这里插入图片描述

代码实现

class TwoStacks {
public:
    vector<int> twoStacksSort(vector<int> numbers) {
        // write code here
        int size=numbers.size();
        stack<int>s;
        stack<int>tmp;
        vector<int> res;
        for(int i=size-1;i>=0;i--)
            s.push(numbers[i]);
        while(!s.empty())
        {
            int top=s.top();
            s.pop();
            if(tmp.empty()||top<=tmp.top())
                tmp.push(top);
            else{
                while(!tmp.empty()&&top>tmp.top())
                {
                    s.push(tmp.top());
                    tmp.pop();
                }
                tmp.push(top);
            }
        }
        while(!tmp.empty())
        {
            s.push(tmp.top());
            tmp.pop();
        }
        while(!s.empty())
        {
            res.push_back(s.top());
            s.pop();
        }
        return res;
    }
};

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值