剑指offer 计划1(栈与队列)---java

时间:2024-02-17 17:15:03

1.1、题目1

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

1.2、解法

解法如题目所说。定义两个栈。这里假设第一个栈为a,第二个栈为b。

实现两个函数增加尾和删除头。

增加即直接push入第一个栈。

删除函数:通过判断a是否为空进行循环,将已经存入的a的栈顶pop存到b中,以此达到倒置的效果。

再将b的栈顶pop出来即可达到删除。

此时a栈为空,下次判断若b栈为空,则输出-1。

否则则继续通过b栈输出栈顶。

1.3、代码

class CQueue {
    Deque<Integer> a;
    Deque<Integer> b;
    public CQueue() {
        a = new LinkedList<Integer>();
        b = new LinkedList<Integer>();
    }
    
    public void appendTail(int value) {
        a.push(value);
    }
    
    public int deleteHead() {
        if(b.isEmpty()){
           while(!a.isEmpty()){
               b.push(a.pop());
           } 
        }
        if(b.isEmpty()){
            return -1;
        }else{
            return (int)b.pop();
        }
    }
}

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue obj = new CQueue();
 * obj.appendTail(value);
 * int param_2 = obj.deleteHead();
 */


2.1、题目2

剑指 Offer 30. 包含min函数的栈

2.2、解法

仍是通过两个栈的方式,第一个栈为d1,第二个栈为d2

d1的push、pop、top不受影响。

至于d2,push时需将d2栈顶元素与目前元素判断,若大于或者等于,则存进d2

pop时,若d2栈顶元素与d1 pop的元素相同,则共同pop

此时d2的栈顶为最小值。

2.3、代码

class MinStack {
    Deque<Integer> d1,d2;
    /** initialize your data structure here. */
    public MinStack() {
        d1 = new LinkedList<Integer>();
        d2 = new LinkedList<Integer>();
    }
    
    public void push(int x) {
        d1.push(x);
        if(d2.isEmpty()||d2.peek()>=x){
            d2.push(x);
        }
    }
    
    public void pop() {
        if(d1.pop().equals(d2.peek())){
            d2.pop();
        }
        
    }



    public int top() {
        return (int)d1.peek();
    }
    
    public int min() {
        return (int)d2.peek();
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.min();
 */