设计一个有getMin功能的栈结构
-
思路
使用两个普通的栈结构进行实现,获取栈中最小元素的时间复杂度为一 -
两个栈,一个s1存放全部元素,另一个s2存放当前栈中的最小元素
push操作时,先判断s2是否为空,若为空或者当前压入栈的数比s2栈顶的数字要小,则直接push,否则不进行操作。而s2则直接进行push操作即可。
pop操作时,先判断s1是否为空,若为空则两个栈都没有元素存在,不为空则则pop出s1的栈顶元素,并判断是否与s2栈顶元素相等,若相等,s2也进行pop操作。
getMin操作时,则判断当前s2中是否为空,若为空则抛出异常,若不为空,则peek当前栈顶元素即为当前栈中的最小元素。 -
Java代码
import java.util.*;
public class Main {
private Stack<Integer> s1;
private Stack<Integer> s2;
public Main(){
this.s1 = new Stack();
this.s2 = new Stack();
}
public void push(int number){
if(s2.isEmpty()){
s2.push(number);
}else if(number <= this.getMin()){
s2.push(number);
}
s1.push(number);
}
public int pop(){
if(s1.isEmpty()){
throw new RuntimeException("nothing!");
}
int value = s1.pop();
if(value == this.getMin()){
s2.pop();
}
return value;
}
public int getMin(){
if(s2.isEmpty()){
throw new RuntimeException("nothing!");
}
int value = s2.peek();
return s2.peek();
}
public static void main(String[] arg){
Main m = new Main();
Scanner scanner = new Scanner(System.in);
int number = Integer.valueOf(scanner.nextLine());
String s;
for(int i=0;i<number;i++){
s = scanner.nextLine();
if(s.equals("pop")){
m.pop();
}else if(s.equals("getMin")){
System.out.println(m.getMin());
}else{
m.push(Integer.valueOf(s.split(" ")[1]));
}
}
}
}
上述代码来源于左神程序员代码面试指南