ayaov

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

剑指 Offer 09. 用两个栈实现队列

https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/

  1. 栈的特征是先入后出,每次元素从栈顶取出
  2. 队列的特征是先入先出,每次元素从队尾取出
    两个栈实现队列的方法描述是:A栈保存每次插入的元素,B栈倒序存储A栈元素。删除元素时,对B栈进行出栈操作,如果B栈为空,则从A栈倒序入栈到B栈。
  • 代码如下:
  class CQueue {

      private Stack<Integer> addStack= new Stack<>();
      private Stack<Integer> delStack = new Stack<>();
      
      public CQueue() {
      
      }
      
      public void appendTail(int value) {
          addStack.push(value);
      }
      
      public int deleteHead() {
          if(!delStack.empty()){
              return delStack.pop();
          }else if(!addStack.empty()){
          while(!addStack.empty()){
              delStack.push(addStack.pop());
          }
          return delStack.pop();
          } else{
          return -1;}
      }
  }
  • 剑指 Offer 30. 包含min函数的栈
    https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/
    1. 一个栈实现出栈入栈和取栈顶数据的功能
    2. 一个栈记录每次入栈时和最小数据栈的栈顶对比不大于的数据
    3. 每次出栈时比较是否和最小值栈顶元素相同,相同则删除最小值的栈顶元素
    4. 最小值栈维护一个非严格的升序排序的数值栈
  • 代码如下:
  class MinStack {

      /** initialize your data structure here. */
      private Stack<Integer> minStack = new Stack<>();
      private Stack<Integer> normalStack = new Stack<>();
      public MinStack() {
          
      }
      
      public void push(int x) {
          normalStack.push(x);
          if(minStack.empty()||minStack.peek()>=x){
              minStack.push(x);
          }
      }
      
      public void pop() {
          if(normalStack.pop().equals(minStack.peek())){
              minStack.pop();
          }
      }
      
      public int top() {
          return normalStack.peek();
      }
      
      public int min() {
          return minStack.peek();
      }
  }
posted on 2021-12-01 21:57  ayaov  阅读(32)  评论(0)    收藏  举报