题目要求
实现一个特殊的栈,实现栈的基本功能基础上,在实现返回栈中最小元素的操作,并且复杂度为o(1)
实现思路
准备一个栈和一个辅助栈,压入第一个元素时同时向栈和辅助栈压入第一个元素,
之后每压一次栈都将该元素和辅助栈对应上一个元素比较,压栈元素大于辅助栈对应前一个元素,
就再次压入上一个元素到辅助栈,否则向辅助栈压入当前元素
这样辅助栈顶就是我们需要的最小元素
举个例子: 4 5 3 9 1 0
栈: 辅助栈
压入4 压入4
压入5 压入4(5和辅助栈上一个元素比较 5>4 压入辅助栈上一个元素)
压入3 压入3(3和辅助栈上一个元素比较 3<4 压入待压栈元素)
压入9 压入3(9和辅助栈上一个元素比较 9>3 压入辅助栈上一个元素)
压入1 压入1(1和辅助栈上一个元素比较 1<3 压入待压栈元素)
输出辅助栈最后一个元素1为最小值
代码
/**
* @description:实现一个特殊的栈,实现栈的基本功能基础上,在实现返回栈中最小元素的操作,并且复杂度为o(1)
* @Author MRyan
* @Date 2020/5/16 17:09
* @Version 1.0
*/
public class StackGetmin {
//栈
private static int[] nums;
//辅助栈
private static int[] help;
private static int size;
private static int helpsize;
public static void main(String[] args) {
//初始化
init(6);
//压栈
push(4);
push(5);
push(3);
push(9);
push(2);
//输出当前栈中最小值 2
System.out.println("the min is:" + getmin());
//弹出栈顶元素
poll();
//压栈
push(1);
//输出当前栈中最小值 1
System.out.println("the min is:" + getmin());
//当前栈的状态
for (int i : nums) {
System.out.print(i + " ");
}
System.out.println();
//辅助栈的状态
for (int i : help) {
System.out.print(i + " ");
}
}
/**
* 获取最小值
*
* @return
*/
public static int getmin() {
//获取辅助栈栈顶元素即是最小值
return help[helpsize];
}
/**
* 初始化
*
* @param stacksize
*/
public static void init(int stacksize) {
if (stacksize < 0) {
throw new IllegalArgumentException("the init size is less than 0");
}
nums = new int[stacksize];
help = new int[stacksize];
size = 0;
helpsize = 0;
}
/**
* 压栈
*
* @param num
*/
public static void push(int num) {
if (size > nums.length) {
throw new IndexOutOfBoundsException("the stack size is full");
}
//压入第一个元素时 直接将第一个元素压栈并且压入辅助栈
if (size == 0) {
nums[0] = num;
help[0] = num;
//栈下标变为1 指向第二个元素
size = 1;
} else {
//压栈
nums[size++] = num;
//如果压入值大于 就再次压入上一个元素到辅助栈
if (num > help[helpsize]) {
help[++helpsize] = help[helpsize - 1];
}
//否则压入待压栈元素到辅助栈
else {
help[++helpsize] = num;
}
}
}
/**
* 获取栈顶元素
*
* @return
*/
public static int peek() {
if (size <= 0) {
throw new IndexOutOfBoundsException("the stack size is empty");
}
return nums[size - 1];
}
/**
* 弹出栈顶元素
*
* @return
*/
public static int poll() {
if (size <= 0) {
throw new IndexOutOfBoundsException("the stack size is empty");
}
//弹出栈顶元素时 辅助栈也跟着弹出
helpsize--;
return nums[--size];
}
}