知识点

  栈是一个先进后出(FILO-First In Last Out)的数据结构,队列是一种先进先出(FIFO-First In First Out)的数据结构。

题目

  实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

要求

  1. pop、push、getMin 操作的时间复杂度都是 O(1)。
  2. 设计的栈类型可以使用现成的栈结构。

难度

  一星

解答

  在设计上我们使用两个栈,一个栈用来保存当前栈中的元素,其功能和一个正常的栈没有区别,这个栈记为 stackData;另一个栈用于保存每一步的最小值,这个栈记 stackMin.

  • 压入数据规则(push)

  假设当前数据为 newNum, 先将其压入 stackData。然后判断 stackMin 是否为空:

  1). 如果为空, 则 newNum 也压入 stackMin。

  2). 如果不为空,则比较 newNum 和 stackMin 的栈顶元素哪一个更小:如果 newNum 更小或两者相等,则 newNum 也压入 stackMin; 如果 stackMin 的栈顶元素更小,则 stackMin 不压入任何内容。这样处理的结果,则是 stackMin 的栈顶元素一定为 stackMin 中的最小值。

  • 弹出数据规则(pop)

  先在 stackData 中弹出栈顶元素,记为 value。然后比较当前 stackMin 的栈顶元素和 value, 从上面压入数据规则知道,stackMin 的栈顶元素一定为 stackMin 中的最小值,所以value 一定大于等于 stackMin 栈顶元素。当 value 等于 stackMin 的栈顶元素时,stackMin 弹出栈顶元素;当 value  大于 stackMin 的栈顶元素, stackMin 不弹出任何元素。结果返回 value。

  • 查询当前栈中的最小值(getMin)

  根据上述压入规则可知,该结果应该返回 stackMin 的栈顶元素.

  具体实现见如下代码:

 import java.util.Stack;

 public class MyStack {

     private Stack<Integer> stackData;
private Stack<Integer> stackMin; //压入数据
public void push(int newNum){
stackData.push(newNum);
if(stackMin.isEmpty()){
stackMin.push(newNum);
}else{
int minValue = stackMin.peek();
if(newNum <= minValue){
stackMin.push(newNum);
}
}
} //弹出数据
public int pop(){
if(stackData.isEmpty()){//栈为空则抛出异常
throw new RuntimeException("该栈不存在任何元素!");
} int value = stackData.pop();
int minValue = stackMin.peek();
if(value == minValue){
stackMin.pop();
} return value;
} //查询最小元素
public int getMin(){
if(stackMin.isEmpty()){//栈为空则抛出异常
throw new RuntimeException("该栈不存在任何元素!");
}
return stackMin.peek(); //peek 方法可以返回栈顶元素, 而不会弹出栈顶元素
}
}

最新文章

  1. [sourceTree]这是一个无效的源路径
  2. html之如何让文字两端对齐
  3. FineUI第九天---表单验证
  4. Soapui 简单学习整理
  5. 随机森林实现 MATLAB
  6. HeadFirst设计模式之迭代器模式
  7. Android 疑难杂症之获取listView Item上面组件的值
  8. replace()、replaceFirst()和replaceAll()的区别
  9. Android中悬浮窗口的实现原理和示例代码
  10. C++第11周(春)项目1 - 存储班长信息的学生类
  11. Jeffrey Richter&#39;s Power Threading Library
  12. User already has more than &#39;max_user_connections&#39; active connections
  13. vue和angular的区别:
  14. Redis学习——Windows环境下Redis的安装(二)
  15. Matplotlib学习---用matplotlib画直方图/密度图(histogram, density plot)
  16. PythonStudy——Python 注释规范
  17. ORACLE UNDO
  18. CentOS上svn checkout时报错SSL handshake failed: SSL error: Key usage violation in certificate has been det
  19. 直接突破百度网盘,用IDM或者迅雷下载。
  20. Sencha Touch 实战开发培训 视频教程 第二期 第六节

热门文章

  1. 京东电商API
  2. struts2国际化---配置国际化全局资源文件并输出国际化资源信息
  3. MyEclipse中加入web项目到tomcat
  4. JavaScript Patterns 2.1 Writing Maintainable Code
  5. ASP.NET SignalR Hubs API Guide - JavaScript Client
  6. Luogu4198 楼房重建
  7. codeforces 764D
  8. 91. Ext中获取combobox中的valueField和displayField的值
  9. PCB genesis 大孔扩孔(不用G84命令)实现方法
  10. javascript 处理链接的多种方式