1.题目描述
实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
输入描述:
第一行输入一个整数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
思路:
主要在于设计的时间复杂度要求是O(1)
2.代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(buf.readLine());
Stack<Integer> stackdata = new Stack();
Stack<Integer> stackMin = new Stack();
for (int i=0;i<n;i++){
String[] str = buf.readLine().split(" ");
if(str[0].equals("push")){
stackdata.push(Integer.parseInt(str[1]));
if(stackMin.isEmpty()){
stackMin.push(Integer.parseInt(str[1]));
}else {
if(stackMin.peek()>= Integer.parseInt(str[1])){
stackMin.push(Integer.parseInt(str[1]));
}
}
}else if(str[0].equals("getMin")){
if(!stackMin.isEmpty()){
System.out.println(stackMin.peek());
}
}else if(str[0].equals("pop")){
if(stackdata.peek().equals(stackMin.peek())){
stackMin.pop();
}
stackdata.pop();
}
}
buf.close();
}
}
3.总结
add & push
共同点:
add,push都可以向stack中添加元素。
不同点:
add是继承自Vector的方法,且返回值类型是boolean。
push是Stack自身的方法,返回值类型是参数类类型。
peek & pop
共同点:
peek,pop都是返回栈顶元素。
不同点:
peek()函数返回栈顶的元素,但不弹出该栈顶元素。
pop()函数返回栈顶的元素,并且将该栈顶元素出栈。
参考:https://blog.youkuaiyun.com/weixin_41126303/article/details/83013444