welcome to my blog
程序员代码面试指南第二版 1.设计一个有getMin功能的栈(栈和队列)
题目描述
实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
输入描述:
第一行输入一个整数N,表示对栈进行的操作总数。
下面N行每行输入一个字符串S,表示操作的种类。
如果S为"push",则后面还有一个整数X表示向栈里压入整数X。
如果S为"pop",则表示弹出栈顶操作。
如果S为"getMin",则表示询问当前栈中的最小元素是多少。
输出描述:
对于每个getMin操作,输出一行表示当前栈中的最小元素是多少。
示例1
输入
6
push 3
push 2
push 1
getMin
pop
getMin
输出
1
2
第一次做, 两种方案1)每次都往s2中压入元素 2)最小值需要更新时才往s2中压入元素, 我使用的是2), 但是有个细节就是a<=s2.peek()时就要往s2中压入a, 而不是a<s2.peek()时压入a, 这样是错误的, 比如压入3,2,1,1,1, s2中只压入了一个1, 弹出时会出问题!
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.Stack;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//Scanner sc = new Scanner(System.in);
String[] str;
myStack s = new myStack();
//str=br.readLine();
int line = Integer.valueOf(br.readLine().split(" ")[0]);
for(int i=0; i<line; i++){
str = br.readLine().split(" ");
if(str[0].equals("push"))
s.push(Integer.valueOf(str[1]));
if(str[0].equals("pop"))
s.pop();
if(str[0].equals("getMin"))
System.out.println(s.getMin());
}
}
public static class myStack{
Stack<Integer> s1 = new Stack<>();
Stack<Integer> s2 = new Stack<>();
public void push(int a){
s1.push(a);
if(s2.isEmpty() || a <= s2.peek()){
s2.push(a);
}
}
public void pop(){
int curr = s1.pop();
if(curr==s2.peek())
s2.pop();
}
public int getMin(){
return s2.peek();
}
}
}