代码随想录算法训练营第十天| LeetCode232.用栈实现队列、LeetCode225. 用队列实现栈

文章介绍了如何使用栈(stackIn和stackOut)和队列(queue)的数据结构实现LeetCode中的队列(MyQueue)和栈(MyStack)功能,重点讲解了如何在pop和top操作中保持队列和栈的顺序正确性。
摘要由CSDN通过智能技术生成

#LeetCode 232. Implement Queue using Stacks

#LeetCode 232. 视频讲解:栈的基本操作! | LeetCode:232.用栈实现队列_哔哩哔哩_bilibili

Stack 类提供的函数:

push(E item): 将指定元素压入栈顶。

pop(): 移除并返回栈顶的元素。

peek(): 返回栈顶的元素但不移除。

empty(): 判断栈是否为空,为空返回true,否则返回false。

search(Object o): 返回对象在栈中的位置,如果对象不在栈中,则返回-1。

如果使用栈(LIFO)实现队列(FIFO)的功能,需要建立两个栈,stackIn 和stackOut 用于将栈内元素顺序调整为队列顺序。队列会先输出1 ,而栈中会先输出3 。解决这种问题,则用另一个栈,将输出的元素先保存起来,则为队列顺序,如下图:

在pop 中使用另一个函数dumpstackIn 来实现stackIn 到stackOut 的转换。第一个if 容易忘记,是考虑在stackOut 非空时,则代表还有队列前几个元素没有全部pop 出,只有stackOut 为空(代表第一次输入的元素都pop 出了)才会继续放入stackIn 的新元素。如果stackOut 不为空继续放入stackIn 元素,那么在pop 时会出现顺序混乱。

 用栈实现队列代码:

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() {
        dumpstackIn();
        return stackOut.pop();
    }
    
    public int peek() {
        dumpstackIn();
        int result = stackOut.pop();
        stackOut.push(result);
        return result;
    }
    
    public boolean empty() {
        return stackIn.isEmpty() && stackOut.isEmpty();
    }

    public void dumpstackIn() {
        if (!stackOut.isEmpty()) {
            return;
        }
        while (!stackIn.isEmpty()) {
            stackOut.push(stackIn.pop());
        }
    }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */

#LeetCode 225. Implement Stack using Queues

#LeetCode 225. 视频讲解:队列的基本操作! | LeetCode:225. 用队列实现栈_哔哩哔哩_bilibili

Queue 接口提供的函数:

boolean add(E e) 和 boolean offer(E e): 将指定的元素插入队列尾部。

E remove() 和 E poll(): 移除并返回队列头部的元素。

E element() 和 E peek(): 返回队列头部的元素但不移除。

int size(): 返回队列中的元素个数。

boolean isEmpty(): 判断队列是否为空。

void clear(): 清空队列中的所有元素。

可以使用一个队列来完成,如图。每次需要输出时是将最后一个元素之前的元素依次放入队列后面,那么余下的第一个元素即为stack 中应该输出的尾部元素。需要注意的是,在top 中,不能直接用peek() 方法来返回队列头部的元素。因为没有移除这个元素,没有修改队列的顺序,如果stack 是123 ,队列中是312 ,是不满足stack 定义的。还是应该通过先pop 出再add 进入。

一个队列完成代码:

class MyStack {
    Queue<Integer> queue;

    public MyStack() {
        queue = new LinkedList<>();
    }
    
    public void push(int x) {
        queue.add(x);
    }
    
    public int pop() {
        moveElement();
        return queue.remove();
    }
    
    public int top() {
        moveElement();
        int result = queue.remove();
        queue.add(result);
        return result;
    }
    
    public boolean empty() {
        return queue.isEmpty();
    }

    public void moveElement() {
        if (queue.size() == 0) {
            return;
        }
        int count = queue.size() - 1;
        while (count > 0) {
            queue.offer(queue.remove());
            count--;
        }
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值