【坚持】Leetcode《剑指offer》学习计划Day01

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

【坚持】Leetcode《剑指offer》学习计划Day01_第1张图片

这道题,对答案有点困惑,为啥要当辅助栈的数据煤油了,才进行主栈传入数据?

class CQueue {

    Deque<Integer> s1;
    Deque<Integer> s2;
    
    public CQueue() {
        s1 = new LinkedList<Integer>();//LinkedList来做Stack的容器,因为LinkedList实现了Deque接口,所以Stack能做的事LinkedList都能做,其本身结构是个双向链表,扩容消耗少
        s2 = new LinkedList<Integer>();
    }

    public void appendTail(int value) {
        s1.push(value);
    }
  
    public int deleteHead() {
        // if(s1.isEmpty()){
        //     return -1;
        // }
        if(s2.isEmpty()){//@辅助栈是空时,把主栈所有数传过来
            while(!s1.isEmpty()){
                s2.push(s1.pop());
            }
        }
        int del;
        if(s2.isEmpty()){
            return -1;
        }else{
            del = s2.pop();
        }
         return   del;
    }
}

点评:
用两个栈,加入只涉及主栈;删除需要辅栈的辅助,一次性应该把主栈的数据全传入到辅栈

剑指 Offer 30. 包含min函数的栈
【坚持】Leetcode《剑指offer》学习计划Day01_第2张图片


class MinStack {
    Stack<Integer> stack1;//用两个系统栈
    Stack<Integer> stack2;

    public MinStack() {
        stack1 = new Stack();//主栈会装下所有数据
        stack2 = new Stack();//辅栈会装入那些较小的数
    }
    
    public void push(int x) {
        stack1.add(x);
        if(stack2.isEmpty()||stack2.peek()>=x){//@啥都会装入主栈,而要装入辅栈前提是栈为空和待入数据较小。能使得辅助栈的栈顶永远是最小的
            stack2.add(x);
        }
    }
    
    public void pop() {
        if(stack1.pop().equals(stack2.peek()))//@这一步很细节,主栈还是实现了pop而辅栈的pop不一定,当两个相同时,会pop出两个数据
            stack2.pop();
    }
    
    public int top() {
        return stack1.peek();
    }
   
    public int min() {
        return stack2.peek();
    }
}

点评:
也用到了两个栈,一个标准栈(数据老老实实装入),一个辅栈在一定条件下能往里面存入较小的数

你可能感兴趣的:(剑指offer基础版,算法,数据结构)