队列和栈面试题(一)— 请编写一个程序,按升序对栈进行排序,要求最多只能使用一个额外的栈存放临时数据

来源:互联网 发布:微星 网络唤醒 编辑:程序博客网 时间:2024/05/24 07:44

题目:请编写一个程序,按升序对栈进行排序,要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。


思路:首先申请一个栈sta来存放数据栈,再申请一个辅助栈help来存放临时数据,然后比较sta弹出的栈顶的值res与help栈顶元素的大小。

当sta栈不为空时:

1、如果help.empty()或者res<=help.top(),那么就把res的值压入help栈中;

2、如果help不为空并且res>help.top(),那么就把help中栈顶的值弹出并压入sta栈,最后把res的值压入help栈中。

具体可看如下过程图:

1 2

3 4

5 6

7 8

9


示例代码:

#include<iostream>#include<string>#include<stack>//pop,top,push#include<vector>using namespace std;class TwoStacks {public:    vector<int> twoStacksSort(vector<int> numbers)     {        stack<int> sta;        for(vector<int>::reverse_iterator riter=numbers.rbegin();riter!=numbers.rend();riter++)            sta.push(*riter);        StackSort(sta);        vector<int> res;        while(!sta.empty())        {            res.push_back(sta.top());            sta.pop();        }        return res;    }    void StackSort(stack<int> &sta)    {        stack<int> help;        while(!sta.empty())        {            int res=sta.top();            sta.pop();            if(help.empty()||res<=help.top())                help.push(res);            else            {                while(!help.empty()&&res>help.top())                {                    sta.push(help.top());                    help.pop();                }                help.push(res);            }        }        while(!help.empty())        {            sta.push(help.top());            help.pop();        }    }};int main(){    int a[5]={1,2,3,4,5};    TwoStacks A;    vector<int> arr(a,a+5),res;    res=A.twoStacksSort(arr);    for(vector<int>::iterator iter=res.begin();iter!=res.end();iter++)        cout<<*iter<<" ";    return 0;}
0 0
原创粉丝点击