数据结构与算法学习(第二天)

这篇博客分享了如何利用两个栈实现队列,并探讨了循环队列和循环双端队列的概念。作者提供了Java代码实现,并提到了Java中Queue通常由LinkedList实现。此外,还介绍了在LeetCode上练习这些数据结构题目时的体会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列

在这里插入图片描述

刷道leetcode题目

在这里插入图片描述

这一题用两个栈,一个instack,一个outstack即可实现,具体逻辑可以看提交的代码

提交的代码

class MyQueue {
    Stack<Integer> instack;
    Stack<Integer> outstack;

    public MyQueue() {
        instack = new Stack<Integer>();
        outstack = new Stack<Integer>();
    }
    
    public void push(int x) {
        instack.push(x);
    }
    
    public int pop() {
        if(outstack.isEmpty()){
            while(!instack.isEmpty()){
                outstack.push(instack.pop());
            }
            return outstack.pop();
        }
        else{
            return outstack.pop();
        }
    }
    
    public int peek() {
        if(outstack.isEmpty()){
            while(!instack.isEmpty()){
                outstack.push(instack.pop());
            }
            return outstack.peek();
        }
        else{
            return outstack.peek();
        }
    }
    
    public boolean empty() {
        if(instack.isEmpty() && outstack.isEmpty())
            return true;
        else
            return false;
    }
}

双端队列

在这里插入图片描述

循环队列

在这里插入图片描述

循环队列添加元素的位置公式:
(当前队头位置+队列元素数)%队列总容度

例如:当前队头位置为0,想要添加一个元素,则该元素应该添加在 (0+5)%7 = 5 的位置上。

在这里插入图片描述
当然,别忘了检查求出的位置是否与队头相同,若相同,则队列已满。
循环队列的核心就在 取模

循环队列的动态扩容如下图所示,元素位置更换后记得把队头位置改为0

在这里插入图片描述

循环双端队列

说白了就是在循环队列的基础上,使队列的两端都能出队入队。

刷道leetcode题

在这里插入图片描述

提交的代码

class MyStack {
    Queue<Integer> q1;
    Queue<Integer> q2;

    public MyStack() {
        q1 = new LinkedList<Integer>();
        q2 = new LinkedList<Integer>();
    }
    
    public void push(int x) {
        if(q1.isEmpty()){
            q1.offer(x);
            while(!q2.isEmpty()){
                q1.offer(q2.poll());
            }
        }
        else{
            q2.offer(x);
            while(!q1.isEmpty()){
                q2.offer(q1.poll());
            }
        }
    }
    
    public int pop() {
        if(q1.isEmpty()){
            return q2.poll();
        }
        else{
            return q1.poll();
        }
    }
    
    public int top() {
        if(q1.isEmpty()){
            return q2.peek();
        }
        else{
            return q1.peek();
        }
    }
    
    public boolean empty() {
        if(q1.isEmpty() && q2.isEmpty())
            return true;
        else
            return false;
    }
}

这里值得注意的是java官方的Queue是在LinkedList中实现的,new一个Queue的正确方式如下:
在这里插入图片描述

同时,应该牢记Java中栈的常用方法为push、pop、peek、isEmpty,队列的常用方法为offer、poll、peek、isEmpty,别跟c++搞混了(总是会把peek记成top)

今天学得有点少,但是没办法,白天基本都在搞软件工程的大作业文档,二叉树就明天再开始吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸数得五

谢谢您的打赏勒

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值