首页 > 代码库 > 设计一个有getMin功能的栈
设计一个有getMin功能的栈
最近在看左程云老师的程序员代码面试指南,里面都是一些很经典的算法,贴出来大家一起学习。
题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
要求:
1、pop、push、getMin操作的时间复杂度都是O(1)。
2、设计的栈类型可以输用现成的栈结构。
方案1:
import java.util.Stack; public class GetMinStack1 { public static class MyStack1 { private Stack<Integer> stackData; private Stack<Integer> stackMin; public MyStack1() { this.stackData = http://www.mamicode.com/new Stack<Integer>(); this.stackMin = new Stack<Integer>(); } //压入 public void push(int newNum) { if (this.stackMin.isEmpty()) { this.stackMin.push(newNum); } else if (newNum <= this.getmin()) { this.stackMin.push(newNum); } this.stackData.push(newNum); } //弹出 public int pop() { if (this.stackData.isEmpty()) { throw new RuntimeException("Your stack is empty."); } int value = http://www.mamicode.com/this.stackData.pop(); if (value =http://www.mamicode.com/= this.getmin()) { this.stackMin.pop(); } return value; } public int getmin() { if (this.stackMin.isEmpty()) { throw new RuntimeException("Your stack is empty."); } return this.stackMin.peek(); } } public static void main(String[] args) { MyStack1 stack1 = new MyStack1(); stack1.push(3); System.out.println(stack1.getmin()); stack1.push(4); System.out.println(stack1.getmin()); stack1.push(1); System.out.println(stack1.getmin()); System.out.println(stack1.pop()); System.out.println(stack1.getmin());: } }
方案2:
import java.util.Stack; public class GetMinStack2 { public static class MyStack2 { private Stack<Integer> stackData;//表示一个栈,栈里面每个元素类型都是Integer类型 private Stack<Integer> stackMin; public MyStack2() { this.stackData = http://www.mamicode.com/new Stack<Integer>(); this.stackMin = new Stack<Integer>(); } //压入 public void push(int newNum) { if (this.stackMin.isEmpty()) { this.stackMin.push(newNum); } else if (newNum < this.getmin()) { this.stackMin.push(newNum); } else { int newMin = this.stackMin.peek(); this.stackMin.push(newMin); } this.stackData.push(newNum); } //弹出 public int pop() { if (this.stackData.isEmpty()) { throw new RuntimeException("Your stack is empty."); } this.stackMin.pop(); return this.stackData.pop(); } public int getmin() { if (this.stackMin.isEmpty()) { throw new RuntimeException("Your stack is empty."); } return this.stackMin.peek();//peek()找到栈顶对象但不移除,pop()移除栈顶对象并作为此函数的值返回该对象 } } public static void main(String[] args) { MyStack2 stack2 = new MyStack2(); stack2.push(3); System.out.println(stack2.getmin()); stack2.push(4); System.out.println(stack2.getmin()); stack2.push(1); System.out.println(stack2.getmin()); System.out.println(stack2.pop()); System.out.println(stack2.getmin()); } }
方案1和方案2都使用stackMin栈保存着stackData每一步的最小值。
共同点是所有操作的时间复杂度都是O(1),空间复杂度都为O(n)。
区别是:方案1中stackMin压入时稍省空间,但是弹出稍费时间;方案2中stackMin压入时稍费空间,但是弹出时稍省时间。
设计一个有getMin功能的栈
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。