(一)、题目
实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
(二)、题目描述
(三)、样例
(四)、备注
(五)、程序代码
import java.util.*;
public class Main {
//创建两个栈。stack1用来存储所有元素,stack2使用栈顶存储最小元素
Stack<Integer> stack1 ;
Stack<Integer> stack2 ;
//初始化
public Main() {
this.stack1 = new Stack<Integer>();
this.stack2 = new Stack<Integer>();
}
//push方法
public void push(Integer num) {
//判断stack2是否为空
if(!stack2.isEmpty()) {
//不为空,则取出stack2的栈顶元素
Integer temp = stack2.peek();
//比较stack2的栈顶元素和num的大小
if(temp >= num) {
//如果栈顶元素大于或等于num,则将num压入stack2中
stack2.push(num);
}
//无论上面的if是否成立,都需要压入stack1栈中
stack1.push(num);
} else {
//如果stack2为空,不用比较,直接两个栈都压入
stack1.push(num);
stack2.push(num);
}
}
//返回栈中的最小元素
public Integer getMin() {
//判断stack2栈中是否为空
if(!stack2.isEmpty()) {
//返回stack2的栈顶元素
return stack2.peek();
}
return -1;
}
//弹出栈顶元素
public void pop() {
//判断stack1栈中是否为空
if(!stack1.isEmpty()) {
//弹出stack1中的栈顶元素
Integer answer = stack1.pop();
//判断stack2中是否为空
if(!stack2.isEmpty()) {
//获得stack2的栈顶元素
Integer judge = stack2.peek();
//如果两者相等,那么也需要弹出stack2的栈顶元素
if(judge == answer) {
stack2.pop();
}
}
}
}
public static void main(String[] args){
Main u = new Main();
Scanner reader = new Scanner(System.in);
//获得操作的次数
Integer sum = reader.nextInt();
Integer[] array = new Integer[sum];
int len = 0;
for(int i = 0; i < sum; i++) {
//获得输入指令
String in = reader.next();
if(in.equals("getMin")) {
//获得最小值
array[len++] = u.getMin();
}else if(in.equals("push")) {
//添加操作
u.push(reader.nextInt());
}else if(in.equals("pop")) {
//删除操作
u.pop();
}
}
for(int i = 0; i < len; i++) {
System.out.println(array[i]);
}
}
}
(六)、代码思路
整体思路是用两个栈来进行存储,stack1就存储需要添加的所有元素,stack2的栈顶则始终存放所有元素中的最小元素
- push方法:这里分为两种情况讨论。一种是stack2为空的情况下,那么新添加的元素肯定是最小元素,所以stack1和stack2中都需要添加元素。另外一种情况是stack2不为空的情况下,那么就需要比较stack2的栈顶元素是否大于或等于新添加的元素,如果是,那就stack1和stack2都要添加新元素。如果不是,那么只需要在stack1中添加即可。
- getMin方法:因为stack2的栈顶始终存储着最小元素,所以直接返回stack2的栈顶元素即可。
- pop方法:这里首先要从stack1中弹出栈顶元素,与stack2中的栈顶元素相比较,如果两者相等,那么stack2也需要弹出栈顶元素。
- 这道代码题所用的时间复杂度为O(n),空间复杂度也为O(n)。