代码随想录DAY10

java的栈和队列

基本概念

  • 栈是一种只能在同一端进行插入和删除(栈顶top)的线性表,运算受限。
  • 进栈/人栈用push, 退栈或出栈用pop
    • boolean empty()
    • void push(E e) (和add()方法效果相同)
    • E pop():出栈并返回栈顶元素
    • E peek():返回栈顶元素(不出栈)

栈的实现方式

顺序栈和链栈
1、顺序栈:基于数组实现

  • 定义一个顺序栈:Stack stack = new Stack<>(), java中Stack是继承Vector类。但需要注意java中栈常用deque而很少采用Stack,因为效率不高。可以上进上出,上进下出,甚至下进上出
    2、链栈:用LinkedList


代码随想录DAY10_第1张图片

ArrayDeque与LinkList区别:

ArrayDeque:

  • 数组结构
  • 插入元素不能为null
  • 无法确定数据量时,后期扩容会影响效率

LinkList:

  • 链表结构
  • 插入元素能为null
  • 无法确定数据量时,有更好表现

232题:用栈实现队列

使用栈实现队列的下列操作:

push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。

思考

1、用两个stack来实现。主要在于取元素的操作,对于队列来说,取元素是取出最上面一个,用栈来实现,需要先将一个栈中的元素放入另一个再取出。

class MyQueue {
    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    public MyQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }
    
    public void push(int x) {
        stackIn.push(x);
    }
    
    public int pop() {
        //判断stackOut是否为空,如果为空需要将stackIn中的所有元素压到out栈中
        if(stackOut.isEmpty()){
            while(!stackIn.isEmpty()){
                stackOut.push(stackIn.pop());
            } 
        }
        return stackOut.pop();
    }
    
    public int peek() {
        int result = this.pop();
        stackOut.push(result);
        return result;
    }
    
    public boolean empty() {
        return stackIn.isEmpty() && stackOut.isEmpty();
    }
}

225题:用队列实现栈

使用队列实现栈的下列操作:

push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空

思路

1,如果参考上一题,采用两个队列也并不能改变元素进出的顺序。

启发

1、采用两个队列和一个队列都可以解答此题。
2、采用两个队列,其中第一个队列用来存放栈中的元素,另一个队列用于存放要取的元素之前的元素,等取出以后再将所有元素放回第一个栈。
3、采用一个队列,放入一个元素后(从第二个开始)就将队列中已有元素取出再放入,这样新放入的元素一直处于对列的头部。

class MyStack {
    Queue<Integer> queue;

    public MyStack() {
        queue = new LinkedList<>();
    }
    
    public void push(int x) {
        queue.offer(x);
        int size = queue.size();
        size--;
        while(size > 0){
            queue.offer(queue.poll());
            size--;
        }
    }
    
    public int pop() {
        return queue.poll();
    }
    
    public int top() {
        return queue.peek();
    }
    
    public boolean empty() {
        return queue.isEmpty();
    }
}

你可能感兴趣的:(leetcode,java,数据结构,算法)