leetcode刷题-232用栈实现队列

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

leetcode232-用栈实现队列

前文

本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。

题目信息

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队列开头的元素 boolean empty() 如果队列为空,返回 true ;否则,返回 false

解题思路分析

解法1

用栈实现队列主要是结合栈和队列的性质进行操作。当向队列中添加元素时,将元素存储在栈顶。当从队列中移除元素时,即为移除首个放入栈中的元素。这种情况下需要将栈中元素出栈后再重新入栈,并将最后一个元素移除。同理,获取队列的首个元素时,则需要将栈进行出栈入栈操作,返回栈中位于栈底的元素。而判断队列是否为空的操作,也就是判断栈是否为空,可以直接调用栈的api。 代码如下:

public class MyQueue {
    Stack stack;
    public MyQueue() {
        stack = new Stack();
    }

    public void push(int x) {
        stack.add(x);
    }

    public int pop() {
        Stack newStack = new Stack();
        int result = -1;
        int length = stack.size();
        for (int i = 0; i < length; i++) {
            newStack.add(stack.pop());
        }
        result = (int)newStack.pop();
        length = newStack.size();
        for (int i = 0; i < length; i++) {
            stack.add(newStack.pop());
        }
        return result;
    }

    public int peek() {
        Stack newStack = new Stack();
        int result = -1;
        int length = stack.size();
        for (int i = 0; i < length; i++) {
            if(i == length-1){
                result = (int)stack.peek();
            }
            newStack.add(stack.pop());
        }
        length = newStack.size();
        for (int i = 0; i < length; i++) {
            stack.add(newStack.pop());
        }
        return result;
    }

    public boolean empty() {
        return stack.isEmpty();
    }
}
复制代码

复杂度分析

本文较为特殊忽略不计。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。

猜你喜欢

转载自juejin.im/post/7017633953603551262