Bootstrap

精选算法面试-队列

一.简介

队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。

LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

二.示例

2.1 用队列实现栈

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

  • push(x) -- 元素 x 入栈

  • pop() -- 移除栈顶元素

  • top() -- 获取栈顶元素

  • empty() -- 返回栈是否为空

注意

  • 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。

  • 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

  • 你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。

第一种

public class MyQueue {
    Queue s1= new LinkedList<>();
    Queue s2= new LinkedList<>();
    public MyQueue() {
    }
    /**
     * 将元素x推导队列的末尾
     * @param x
     */
    public void  push(int x){
        while (!s1.isEmpty()){
            s2.offer(s1.poll());
        }
        s1.offer(x);
        while (!s2.isEmpty()){
            s1.offer(s2.poll());
        }
    }
    /**
     * 从队列的开头移除并返回元素
     * @return
     */
    public int pop(){
        return s1.poll();
    }
    /**
     * 返回队列开头元素
     * @return
     */
    public int peek(){
        return s1.peek();
    }
    /**
     * 如果队列为空,返回true ,否则 false
     * @return
     */
    public boolean empty(){
        return !s1.isEmpty() && !s2.isEmpty();
    }
}

第二种方法

public class MyQueue {
Queue s1= new LinkedList<>();
public void  push(int x){
    //移多少位
    int size = s1.size();
    //根据遍历,每次把前面的结点,放到后面,留有一个头结点
    //留有一个头结点
    s1.offer(x);
    for (int i = 0; i < size; i++) {
      s1.offer(s1.poll());
    }
}
public int pop(){
return s1.poll();
}
public int peek(){
return s1.peek();
}
public boolean empty(){
return s1.isEmpty();
}
}