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

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



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

当sta栈不为空时:

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

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

具体可看如下过程图:



示例代码:

#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;
}
时间: 2024-08-31 03:29:11

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

最有价值的50道java面试题 适用于准入职Java程序员_java

下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最新版本,去掉了EJB 2.x等无用内容,补充了数据结构和算法相关的题目.经典面试编程题.大型网站技术架构.操作系统.数据库.软件测试.设计模式.UML等内容,同时还对很多知识点进行了深入的剖析,例如hashCode方法的设计.垃圾收集的堆和代.Java新的并发编程.NIO.2等,相信对准备入职的Ja

《.NET程序员面试秘笈》----面试题16 请简述 .NET的命名空间

面试题16 请简述 .NET的命名空间 .NET程序员面试秘笈 [考点].NET的命名空间的基本理解,自定义命名空间的知识,在程序中使用命名空间的各种技巧. [出现频率] [解答] 使用命名空间的方法可以反映程序中的逻辑关系,并且可以有效避免类名冲突.命名空间就是各种类或其他类型名称的逻辑组织方式,而不代表物理组织方式.例如以下代码: System.Windows.Forms.MessageBox.Show("文本内容"); 在执行以上代码时,将跳出一个带有"确定"

java-下面是两道题,作为初学者我最近遇到的两个面试题,请各位帮我看看

问题描述 下面是两道题,作为初学者我最近遇到的两个面试题,请各位帮我看看 下面两个题仅限于java解答 1. 实现一个lite版的字符串替换函数 char[] strreplace(char[] str, char[] sub, char[] rep) 2. 对任意数据进行Base64编码 char[] base64_encode(byte[] data)

java-初学者JAVA编写的程序问题,请帮我看看哪里错了

问题描述 初学者JAVA编写的程序问题,请帮我看看哪里错了 这个是程序 mport java.io.*; public class shuru{ public static void main(String[] args){ try { InputStreamReader is=new InputStreamReader(System.in); BufferedReader br= new BufferedReader(is); String s; **(1)System.out.print("

求解决-请用c语言编写此程序,重点在怎么把None输出,求指教

问题描述 请用c语言编写此程序,重点在怎么把None输出,求指教 /**输出21世纪中截止某个年份以来的所有闰年年份.注意:闰年的判别条件是该年年份能被4整除但不能被100整除.或者能被400整除. 输入格式: 输入在一行中给出21世纪的某个截止年份. 输出格式: 逐行输出满足条件的所有闰年年份,即每个年份占一行.输入若非21世纪的年份则输出"Invalid year!".若不存在任何闰年,则输出"None". 输入样例1: 2048 输出样例1: 2004 200

用HTML编写应用程序

程序 HTML是Hypertext Markup Language(超文本标记语言)的缩写,它是构成Web页面(Page)的主要工具,是用来表示网上信息的符号标记语言. 在网上,如果要向全球范围内出版和发布信息,需要有一种能够被广泛理解的语言,即所有的计算机都能够理解的一种用于出版的"母语".WWW(World Wide Web)所使用的出版语言就是HTML语言.通过HTML,将所需要表达的信息按某种规则写成HTML文件,通过专用的浏览器来识别,并将这些HTML"翻译&quo

为Windows Phone和iOS编写应用程序

有许多文档介绍将应用程序从 iOS 移植到 Windows Phone,但是在本文中,我要从为这两种平台从 头开始编写新应用程序的前提开始讲起.我不会对这两种平台户的孰优孰劣做出价值评判.相反,我对 编写应用程序报以务实的态度,并描述在编写应用程序时这两种平台的异同之处. 作为 Windows Phone 团队的成员,我对 Windows Phone 平台充满热忱,但是本文的重点不是说一种平台优 于另一种平台,而是说平台是不同的,因此需要一些不同的编程方法.尽管您可以使用 MonoTouch 系

断点-关于delphi编写的程序在某些操作系统上运行出错的问题

问题描述 关于delphi编写的程序在某些操作系统上运行出错的问题 大家好 本人从事程序测试工作3年左右 还属于菜鸟级别 目前遇到了一个比较棘手的问题 希望高手可以指点 关于delphi编写的程序在某些操作系统上运行出错的问题:同样的程序在xp系统可以正常运行 在win7某些系统可以 某些系统不行(即使是win7旗舰版32位正常安装的已经打上sp1补丁的系统) 所加的断点不起作用 不能够显示 直接抛系统错误(外部组件异常之类的) 希望精通delphi程序以及操作系统的高手可以指点下 如果可以远程

有没有会编写c程序的大神,帮我看看两个单独的程序怎么合成一个程序,谢谢

问题描述 有没有会编写c程序的大神,帮我看看两个单独的程序怎么合成一个程序,谢谢 #include #include struct e { char a[10]; char b[10]; }z; int main() { int t=0; char s[10],d[10]; FILE *p; void as(); if ((p=fopen("m.txt","r+"))==NULL) { p=fopen("m.txt","w+"