package StackAndQueueSummary;
import java.util.Stack;
//设计含min函数的栈,要求min、push、pop的时间复杂度都是O(1)
/* 存入元素以整数为例
* 算法思想:需要设计一个辅助栈,用来存储当前栈中元素的最小值。
* 网上有人说存储最小元素的位置,虽然节省空间,但是在每次调用min函数的时候,只能得到对
* 只能得到位置信息,还需要对存储元素不断的pop,才能得到最小值。
*
* 因此还是采用辅助栈存储最小元素
* 注意:push操作,第一个元素不用比较,自动成为最小值入栈,
* 其他元素每次都要与栈顶元素比较,小的一方入栈成为栈顶。
*
*/
public class NewStack {
private Stack<Integer> stack;
//用来存储最小元素
private Stack<Integer> minstack ;
public NewStack(){
stack = new Stack<>();
minstack = new Stack<>();
}
public void push(int item){
stack.push(item);
if(minstack.isEmpty()){
minstack.push(item);
}else{
if(item < minstack.peek()){
//item小于之前存入元素的最小值,说明item成为了当前栈(stack)中存在的元素的最小的。
minstack.push(item);//将其存入minstack
}else{
//item大于之前存入元素的最小值,说明item不是已有元素中最小的,最小的仍然是之前最小的哪个
minstack.push(minstack.peek());
}
}
}
public int pop() throws Exception{
if(stack.isEmpty()){
throw new Exception("The stack is empty");
}
minstack.pop();//将最小元素栈中的栈顶元素删除
return stack.pop();
}
public int peek() throws Exception{
if(stack.isEmpty()){
throw new Exception("The stack is empty");
}
return stack.peek();
}
public int min() throws Exception{
if(stack.isEmpty()){
throw new Exception("The stack is empty");
}
return minstack.peek();
}
public static void main(String[] args) throws Exception {
NewStack newStack = new NewStack();
newStack.push(11);
newStack.push(9);
newStack.push(2);
newStack.push(8);
System.out.println(newStack.min());
newStack.pop();
newStack.pop();
System.out.println(newStack.min());
}
}
数据结构与算法之栈与队列
最新推荐文章于 2024-11-04 20:33:37 发布