zoukankan      html  css  js  c++  java
  • [LintCode 229.] 栈排序

    229. 栈排序

    题目描述

    请设计一种方法将一个栈进行升序排列 (最大的数在最上面)。

    你可以使用另外一个栈来辅助操作,但不可将这些数复制到另外一个数据结构中 (如,数组)。

    样例
    给一个栈:[4,2,1,3],
    排序之后:[1,2,3,4],
    最右边是栈顶。

    注意事项
    时间复杂度为O(n^2)的算法也可以通过测试

    解题思路

    双栈操作。
    使用两个栈,一个大顶栈,一个小顶栈。指定给定的栈为大顶栈,使用小顶栈逐步梳理大顶栈顶部元素顺序。

    1. 首先从大顶栈依次弹出元素,并压入小顶栈,直到弹出的元素比小顶栈的栈顶大;
    2. 然后栈顶比该元素小的元素,依次弹出并压入大顶栈,然后压入该元素;
    3. 回到第一步,重复前面的操作,直到大顶栈中没有元素,进入下一步;
    4. 将小顶栈中的元素依次弹出并压入大顶栈。

    参考代码

    class Solution {
    public:
        /*
         * @param stk: an integer stack
         * @return: void
         */
        void stackSorting(stack<int>& stk) {
            // write your code here
            if (stk.size() <= 1) return;
    
            stack<int>& maxTop = stk;
            stack<int> minTop;
            while (!maxTop.empty()) {
                while (!maxTop.empty() && (minTop.empty() || minTop.top() > maxTop.top())) {
                    int val = maxTop.top();
                    minTop.push(val);
                    maxTop.pop();
                }
                if (maxTop.empty()) break;
                int val = maxTop.top();
                maxTop.pop();
                while (!minTop.empty() && minTop.top() < val) {
                    int tmp = minTop.top();
                    minTop.pop();
                    maxTop.push(tmp);
                }
                minTop.push(val);
            }
            while (!minTop.empty()) {
                int val = minTop.top();
                minTop.pop();
                maxTop.push(val);
            }
        }
    };
    
  • 相关阅读:
    linux下错误的捕获:errno和strerror的使用
    三角识别注意事项
    关于udo3d双目相机的嵌入式板子系统重装
    为网页背景添加一个跟随鼠标变幻的动态线条
    API工具下载地址记录一下
    Eclipse 安装 SVN 插件的两种方法
    java技术面试之面试题大全
    烧绳子问题
    Java web 项目 web.xml 配置文件加载过程
    mysql绿色版安装配置
  • 原文地址:https://www.cnblogs.com/zhcpku/p/14260237.html
Copyright © 2011-2022 走看看