zoukankan      html  css  js  c++  java
  • 【程序员面试金典】面试题 03.05. 栈排序

    题目

    栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。

    示例1:

    输入:
    ["SortedStack", "push", "push", "peek", "pop", "peek"]
    [[], [1], [2], [], [], []]
    输出:
    [null,null,null,1,null,2]
    

    示例2:

    输入: 
    ["SortedStack", "pop", "pop", "push", "pop", "isEmpty"]
    [[], [], [], [1], [], []]
    输出:
    [null,null,null,null,null,true]
    

    说明:栈中的元素数目在[0, 5000]范围内。

    思路

    使用两个栈

    • push
      • 如果栈不为空并且新加入元素大于栈顶元素,则不断取出栈顶元素加入辅助栈,最后再将元素加入data栈,然后将辅助栈中的元素再重新放入data栈中
      • 否则直接放入data栈
    • pop
      • data栈不为空,直接pop
    • peek
      • 直接取出data栈顶元素
    • isEmpty
      • 返回data栈是否为空

    代码

    时间复杂度:O(n)
    空间复杂度:O(n)

    class SortedStack {
        stack<int> data;
        stack<int> help;
    public:
        SortedStack() {
    
        }
        
        void push(int val) {
            if (!data.empty() && val > data.top()) {
                while (!data.empty() && val > data.top()) {
                    help.push(data.top());
                    data.pop();
                }
                data.push(val);
                while (!help.empty()) {
                    data.push(help.top());
                    help.pop();
                }
            } else {
                data.push(val);
            }
        }
        
        void pop() {
            if (!data.empty()) data.pop();
        }
        
        int peek() {
            if (!data.empty()) return data.top();
            return -1;
        }
        
        bool isEmpty() {
            return data.empty();
        }
    };
    
  • 相关阅读:
    驾驶细节
    python 字符串前面加u,r,b,f的含义
    pandas dataframe指定列字符串转成数字的方法
    python 休息随机秒
    Windows搭建ffmpeg推流服务端 sky
    在golang中如何正确判断接口是否为nil
    快速了解一门技术的学习方法
    TortoiseGit使用教程(图文详细版)
    centos7升级安装openssl版本
    CentOS7防火墙,开放端口配置
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/13170278.html
Copyright © 2011-2022 走看看