1. 题目

栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。
最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。
该栈支持如下操作: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]范围内。

2. 解题

  • 用两个栈,来回倒数据,保证其中一个为空
  • 倒的过程中找到最小的放在非空的栈的顶端
class SortedStack {stack<int> s;stack<int> temp;int nextMin;
public:SortedStack() {}void push(int val) {if(isEmpty())s.push(val);else if(temp.empty()){if(s.top() < val)//栈顶小swap(val,s.top());//把栈顶变成大的s.push(val);//在把原来的小栈顶放回}else //s.empty(){if(temp.top() < val)swap(val,temp.top());temp.push(val);}}void pop() {if(isEmpty())return;if(temp.empty()){s.pop();//最小值popwhile(!s.empty())//倒数据到temp{nextMin = s.top();s.pop();if(!temp.empty() && nextMin > temp.top())swap(nextMin, temp.top());temp.push(nextMin);}}else //s.empty(){temp.pop();//最小值while(!temp.empty())//倒数据到s{nextMin = temp.top();temp.pop();if(!s.empty() && nextMin > s.top())swap(nextMin, s.top());s.push(nextMin);}}}int peek() {if(isEmpty())return -1;if(temp.empty())return s.top();else //s.empty()return temp.top();}bool isEmpty() {return s.empty()&&temp.empty();}
};

程序员面试金典 - 面试题 03.05. 栈排序(两栈)相关推荐

  1. 程序员面试金典 - 面试题 03.01. 三合一(数组栈)

    1. 题目 三合一.描述如何只用一个数组来实现三个栈. 你应该实现push(stackNum, value).pop(stackNum).isEmpty(stackNum).peek(stackNum ...

  2. 程序员面试金典 - 面试题 17.05. 字母与数字(哈希map+思维转换)

    1. 题目 给定一个放有字符和数字的数组,找到最长的子数组,且包含的字符和数字的个数相同. 返回该子数组,若存在多个最长子数组,返回左端点最小的.若不存在这样的数组,返回一个空数组. 示例 1: 输入 ...

  3. 程序员面试金典 - 面试题 08.05. 递归乘法(位运算)

    1. 题目 递归乘法. 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘. 可以使用加号.减号.位移,但要吝啬一些. 示例1:输入:A = 1, B = 10输出:10示例2:输入:A = ...

  4. 程序员面试金典 - 面试题 16.05. 阶乘尾数(5的因子)

    1. 题目 设计一个算法,算出 n 阶乘有多少个尾随零. 示例 1: 输入: 3 输出: 0 解释: 3! = 6, 尾数中没有零.示例 2: 输入: 5 输出: 1 解释: 5! = 120, 尾数 ...

  5. 程序员面试金典 - 面试题 10.05. 稀疏数组搜索(二分查找)

    1. 题目 稀疏数组搜索.有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置. 示例1:输入: words = ["at", "" ...

  6. 程序员面试金典 - 面试题 04.05. 合法二叉搜索树(中序遍历)

    1. 题目 实现一个函数,检查一棵二叉树是否为二叉搜索树. 示例 1: 输入:2/ \1 3 输出: true示例 2: 输入:5/ \1 4/ \3 6 输出: false 解释: 输入为: [5, ...

  7. 程序员面试金典 - 面试题 03.06. 动物收容所(队列)

    1. 题目 动物收容所.有家动物收容所只收容狗与猫,且严格遵守"先进先出"的原则. 在收养该收容所的动物时,收养人只能收养所有动物中"最老"(由其进入收容所的时 ...

  8. 程序员面试金典 - 面试题 03.03. 堆盘子 (vector(stack))

    1. 题目 堆盘子.设想有一堆盘子,堆太高可能会倒下来.因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子. 请实现数据结构SetOfStacks,模拟这种行为.SetOfStacks 应 ...

  9. 程序员面试金典 - 面试题 02.05. 链表求和

    1. 题目 给定两个用链表表示的整数,每个节点包含一个数位. 这些数位是反向存放的,也就是个位排在链表首部. 编写函数对这两个整数求和,并用链表形式返回结果. 示例: 输入:(7 -> 1 -& ...

最新文章

  1. 夸克浏览器有没有linux,夸克浏览器怎么样?夸克浏览器使用说明
  2. 视音频编解码学习工程:JPEG分析器
  3. 9.03-Springboot要点记录
  4. upload Fiori application to ABAP server via report /UI5/UI5_REPOSITORY_LOAD
  5. nodejs npm常用命令
  6. Linux系统调用表(system call table)
  7. 为什么大数据分析很重要
  8. 简单的linux下docker的下载与安装
  9. ASCII码转HEX与HEX转ASCII码
  10. fh 幅频特性曲线怎么画fl_放大电路幅频特性曲线的测试方法.PPT
  11. IDEA 统计插件Statistic:查看你的代码量
  12. phpmyadmin mysql配置_phpmyadmin配置方式
  13. vue端口号被占用报错npm ERR! @1.0.0 dev: `node build/dev-server.js`
  14. html点击控制盒子左右移动,JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例...
  15. 实战Nagios NSCA方式监控Linux系统资源使用情况 -- Nagios配置篇 -- Nagios Server端
  16. C# 2.0 Graphics 画雪人
  17. 实验7 蓝桥ROS1使用外设 适用kinetic/melodic/noetic
  18. 帝国模板留言板增加自定义字段教程
  19. 17-1-数据处理思想和程序架构: 单片机stm32的flash保存数据优化方案(让擦写次数达到上百万至上千万次)
  20. 原知因制药将亮相第五届进博会,解锁青春逆龄密码

热门文章

  1. bem什么意思_bem是什么意思_bem的翻译_音标_读音_用法_例句_爱词霸在线词典
  2. DVWA-SQL注入
  3. 【传智播客】Libevent学习笔记(三):事件循环
  4. WebSocket介绍
  5. JDBC连接数据库(Java DataBase Connectivity,java)
  6. css div设置inline-block后 div顶部对齐
  7. 基于XMPP实现的Openfire的配置安装+Android客户端的实现
  8. 对一个 复杂的json结果进行取值的例子
  9. 电影:『新警察故事』
  10. unlink(file_name)