leetcode总结(232 && 225 : 使用队列实现栈以及使用栈实现队列)

这篇博客详细介绍了如何使用队列实现栈(225题)以及使用栈实现队列(232题)。在225题中,通过两个队列q1和q2,借助top变量实现了栈的基本操作,包括push、pop和top,pop操作的时间复杂度为O(n)。而在232题中,利用两个栈,当需要从队列头部操作时,将栈1的元素转移至栈2。所有操作的平均时间复杂度为O(1)。博客旨在总结和复习数据结构知识。
摘要由CSDN通过智能技术生成

题目链接及描述

分别为leetcode 中的232 以及 225,数据结构类型题目,大致要求是分别用队列和栈实现栈和队列
链接: 232. implement queue using stacks. && 225. implement stack using queues.

225. implement stack using queues

思路

使用2个队列(q1, q2), 其中q1用于存储实际栈中的内容,由于栈和队列的不同特性(栈为先进后出FILO,队列为先进先出FIFO), 因此需要另外一个队列进行辅助。并且为了读取栈最顶端的数据方便,需要定义一个变量top,以实现栈的top() 操作。

代码

初始化

	private Queue<Integer> q1;
    private Queue<Integer> q2;
    int top;
    
    /** Initialize your data structure here. */
    public MyStack() {
        q1 = new LinkedList<>();
        q2 = new LinkedList<>();
    }

如图, 左边为将要实现的结果(MyStack), 右边为实际的结构,相当于左边为黑盒子,右边为黑盒子里的内容
在这里插入图片描述
插入操作
当我们要对插入一个元素时,只需将元素插入queue1中即可,并且每插入一个元素,就将top等于那个元素,即为栈顶

 /** Push element x onto stack. */
    public void push(int x) {
   
        q1.offer(x);
        top = x;
    }

此处模拟插入4个元素(1 - 4)
在这里插入图片描述
弹出操作
要实现栈的 pop() 操作,此时就需要借助另外一个队列(queue2), 具体操作为:

  1. 队列1中的元素弹出,放入队列2中(并使用top进行标记),直到队列1剩下一个数,这个数即为栈顶值。
  2. 将栈顶值弹出并记录,同时top就指向了原栈顶后的值
  3. 将队列2的数弹出并放入队列1中,维持原有队列的顺序。此处,使用指针将地址进行交换,减少代码运行时间
  4. 将栈顶值返回,
/** Removes the element on top of the stack and returns that element. */
    public int pop() {
   
        while (q1.size() > 1) {
   
            top = q1.poll();
            q2.offer(top);
        }
        int result = q1.poll();
        Queue<Integer> temp = q2;
        q2 = q1;
        q1 = temp;
        return result;
    }

将q1 中的元素弹出,每弹出一个,将其标记为top,同时放入q2 中
在这里插入图片描述
弹出栈顶元素后,queue1 和 queue2 交换位置(指向相互之间的地址)
在这里插入图片描述
top() 以及 empty()
由于代码在操作过程中不断维护top对栈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值