(Java)数据结构之队列(Queue),含有三个OJ题(用队列实现栈
光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性。
import java.util.LinkedList;
import java.util.Queue;
public class TestQueue {
public static void main(String[] args) {
Queue q = new LinkedList<>();
q.offer(1);
q.offer(2);
q.offer(3);
q.offer(4);
q.offer(5);
System.out.println(q);
System.out.println(q.size());
q.poll();
q.poll();
System.out.println(q);
System.out.println(q.isEmpty());
}
}
//执行结果:[1, 2, 3, 4, 5]
// 5
// [3, 4, 5]
// false
3. 队列的模拟实现
===========
public class Queue {
public static class ListNode{
E val;
ListNode next;
ListNode pre;
ListNode(E val){
this.val = val;
}
}
ListNode first; //队头
ListNode last; //队尾
int size = 0;
//入队列—插新节点
public void offer(E e){
ListNode newNode = new ListNode<>(e);
if(first==null){
first = newNode;
last = newNode;
}else{
last.next = newNode;
newNode.pre = last;
last = newNode;
}
size++;
}
//出队列—删除头
public E poll(){
E val = null;
if(first==null){
return null;
}else if(first == last){
first = null;
last = null;
}else{
val = first.val;
first = first.next;
first.pre.next = null;
first.pre = null;
}
size–;
return val;
}
//获取队头元素
public E peek(){
if(first == null){
return null;
}
return first.val;
}
//获取长度
public int size(){
return size;
}
//判空
public boolean isEmpty(){
return first==null;
}
//栈和队列一般不进行遍历操作
public static void main(String[] args) {
Queue q = new Queue<>();
q.offer(1);
q.offer(2);
q.offer(3);
q.offer(4);
System.out.println(q.size());
System.out.println(q.peek());
q.poll();
System.out.println(q.size());
}
}
4. 循环队列
========
循环队列使用的是循环数组,为什么不使用普通的数组呢?
如果使用一段连续的空间则会造成空间假溢出,造成空间的浪费,因为队列是在尾端进行插入,在头部进行删除,这样会造成数组中的元素偏后,如下面的情形:
所以使用的循环数组,循环队列就是解决空间的假溢出。
当对头与队尾重合时如何区分循环队列的空与满呢?我们可以通过添加size来记录队列元素的个数,当size为0时队列为空,当size不为0时,队列为满。
下面是循环队列的实现:
//循环队列
public class CircularQueue {
int array[];
int rear = 0; //队尾下标
int front = 0; //队头下标
int count = 0; //队列的有效元素的个数
int N;
public CircularQueue(int k) {
array = new int[k]; //创建一个数组
N = array.length; //用N标记数组的长度
}
public boolean enQueue(int value) { //入队列
if(isFull()){
return false; //如果队列已经满了,则返回false
}
array[rear] = value;
rear++;
if(rear==N){ //rear返回起始位置
rear = 0;
}
count++;
return true;
}
public boolean deQueue() { //出队列
if(isEmpty()){ //如果队列为空,则返回false
return false;
}
front++;
front%=N; //front返回起始位置
count–;
return true;
}
public int Front() { //获取队头元素
if(isEmpty()){
return -1;
}
return array[front];
}
public int Rear() { //获取队尾元素
if(isEmpty()){
return -1;
}
return array[(rear-1+N)%N]; //队尾元素的下标为rear-1,如果rear为0,则下标就为-1了,所以需要(rear-1+n)% n
}
public boolean isEmpty() { //检测队列是否为空
return count==0;
}
public boolean isFull() { //检测队列是否已满
return count==N;
}
}
5. 双端队列
=========
双端队列是指允许两端都可以进行入队列和出队列操作的队列,deque(double ended queue的简称)。
========================================================================================================================================================================================================================
6. OJ题
========
1. 用队列实现栈 (LeetCode225)用队列实现栈
可以点开上面链接来查看题目
方法:
1. 先创建两个队列
2. 判空:如果两个队列都为空,则返回true,否则返回false
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

最后
光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性
Java面试宝典2021版
最常见Java面试题解析(2021最新版)
2021企业Java面试题精选
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
a面试宝典2021版
[外链图片转存中…(img-nJNTNxax-1712547697795)]
[外链图片转存中…(img-hUDRSRVc-1712547697795)]
最常见Java面试题解析(2021最新版)
[外链图片转存中…(img-8v6StLRF-1712547697795)]
[外链图片转存中…(img-OxcOHQlk-1712547697796)]
2021企业Java面试题精选
[外链图片转存中…(img-VihO4lYd-1712547697796)]
[外链图片转存中…(img-GSK0Tsmq-1712547697797)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)