数据结构与算法之栈与队列

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());
  
  
 }
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值