[LeetCode]232. 用栈实现队列(扩展:用队列实现栈)

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

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

示例:

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);  
queue.peek();  // 返回 1
queue.pop();   // 返回 1
queue.empty(); // 返回 false

说明:

  • 你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
  • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。




思路

1.创建两个栈,一个用于输入,一个用于输入。输入的栈负责队列的push进来的数据。当队列需要pop或者peek时, 需要把输入栈的内容进入输出栈,再在输出栈中执行pop或者peek,当输出栈中还有值时就不要将输入栈的内容进入输出栈。

public class MyQueue {
	//输入栈
    private Stack<Integer> inputStack;
    //输出栈
    private Stack<Integer> outputStack;

    public MyQueue() {
        inputStack = new Stack<>();
        outputStack = new Stack<>();
    }

    
    public void push(int x) {
        inputStack.push(x);
    }

    public int pop() {
    	//如果输出栈为空,则将输入栈中元素全部转给输入栈中
        if (outputStack.isEmpty()) {
            while (!inputStack.isEmpty()) {
                outputStack.push(inputStack.pop());
            }
        }
        return outputStack.pop();
    }

    public int peek() {
        if (outputStack.isEmpty()) {
            while (!inputStack.isEmpty()) {
                outputStack.push(inputStack.pop());
            }
        }
        return outputStack.peek();
    }

    public boolean empty() {
        return inputStack.isEmpty() && outputStack.isEmpty();
    }
}




扩展

用队列实现栈

1.创建两个队列,输入队列和输出队列。输入队列用于push操作。push时将输出队列的数据放入到输入队列这样就达到了数据颠倒,然后将交换输入队列和输出队列。

class MyStack {
	//输入队列
    private Queue<Integer> inputQueue;
    //输出队列
    private Queue<Integer> outputQueue;

    public MyStack() {
        inputQueue = new LinkedList<>();
        outputQueue = new LinkedList<>();
    }

    public void push(int x) {
        inputQueue.offer(x);
        //将输出队列中元素全部转给输入队列
        while (!outputQueue.isEmpty()) {
            inputQueue.offer(outputQueue.poll());
        }
        //交换输入队列和输出队列,是的输入队列在push的时候始终为空队列
        Queue<Integer> temp = inputQueue;
        inputQueue = outputQueue;
        outputQueue = temp;
    }

    public int pop() {
        return outputQueue.poll();
    }

    public int top() {
        return outputQueue.peek();
    }

    public boolean empty() {
        return outputQueue.isEmpty();
    }
}
发布了36 篇原创文章 · 获赞 28 · 访问量 1505

猜你喜欢

转载自blog.csdn.net/tc979907461/article/details/105104573