数据结构 —— 队列

1.队列的介绍

队列是一种先进先出的数据结构,这和栈有所不同,但又更容易理解。类似于食堂排队打饭,车站排队买票。

后来的人排在队伍最后边,先来的人先打饭或者买票走。如图

在这里插入图片描述

队列总是从队尾插入元素,而从队首移除元素,满足先进先出的规则。因此需要一个队首指针front指向队首元素的前一个位置,而使用一个队尾指针rear来指向队尾元素。

,需要一个队首指针front来指向队首元素的前一个位置,而使用一个队尾指针rear来指向队尾元素。和栈类似,当使用数组来实现队列时,队首指针front和队尾指针rear为int型变量(数组下标从0开始);而当使用链表来实现队列时,则为int*型变量的指针。这样当使用数组来实现上面的例子时,队首指针front和队尾指针rear的指向情况如图7-3所示。接下来介绍队列的常用操作,包括清空(clear)、 获取队列内元素的个数(size)、 判空(empty)、入队(push)、 出队(pop)、取队首元素(get_ front). 取队尾元素(get _rear) 等。下面将使用数组q[ ]来实现队列,而int型变量front存放队首元素的前一个元素的下标、rear存放队尾元素的下标(数组下标从0开始)。下面对常见操作进行示范实现:在这里插入图片描述

(1)清空(clear)

使用数组来实现队列时,初始状态为front=-1、rear=-1, 前面的图中第一步rear指向0是因为此时队列中已经有一一个元素了,如果没有元素,rear 应当是指向-1位置的。

void clear()

{

front=rear=-1;

}

(2) 获取队列元素的个数(size)

显然 rear-front即为队列元素的个数,从上图很容易看出。

int size()

{

return rear-front;

}

(3)判空(empty)

判断队列为空的条件为front==rear.

bool empty()

{

if(front==rear) return true;

else return false ;

}

(4) 入队(push)

由于队尾指针rear指向队尾元素,因此把元素入队时,需要先把rear加1,然后再存到rear指向的位置。

void push(int x)

{

q[++rear]=x;

}

(5)出队(pop)

可以直接把队首指针加1来实现出队的效果。

void pop()

{

front++;

}

(6)取队首元素(get_front)

由于队首指针front指向的是队首元素的前一个元素,因此front+1才是队首元素的位置。

int get_front()

{

return q[front+1];

}

(7)取队尾元素,队尾指针指向的是队尾元素,因此可以直接访问rear的位置。

int get_rear()

{

return q[rear];

}

当然这里我更习惯于另一种写法

给出 模板

//front表示队头,rear表示队尾

int q[N],front = 0, rear = -1;

//向队尾插入一个数

q[++rear] = x;

//从队头弹出一个数

front++;

//队头的值

q[front];

//队尾的值

q[rear];

//判断队列是否为空

if (front <= rear)

{

}

实现一个队列,队列初始为空,支持四种操作:

(1) “push x” – 向队尾插入一个数x;

(2) “pop” – 从队头弹出一个数;

(3) “empty” – 判断队列是否为空;

(4) “query” – 查询队头元素。

现在要对队列进行M个操作,其中的每个操作3和操作4都要输出相应的结果。

输入格式

第一行包含整数M,表示操作次数。

接下来M行,每行包含一个操作命令,操作命令为”push x”,”pop”,”empty”,”query”中的一种。

输出格式

对于每个”empty”和”query”操作都要输出一个查询结果,每个结果占一行。

其中,”empty”操作的查询结果为“YES”或“NO”,”query”操作的查询结果为一个整数,表示队头元素的值。

数据范围

1≤M≤100000,

1≤x≤109,

所有操作保证合法。

输入样例:

10

push 6

empty

query

pop

empty

push 3

push 4

pop

query

push 6

输出样例:

NO

6

YES

4

#include

#include

#include

#include

using namespace std;

const int maxn = 1e5 + 10;

int q[maxn],hh=0,tt=-1;

int main()

{

int M;

cin >> M;

while (M–)

{

string order;

int x;

cin >> order;

if (order == “push”) //插入

{

cin >> x;

q[++tt] = x;

}

else if (order == “query”) //查询队头

{

cout << q[hh] << endl;

}

else if (order == “pop”) //弹出队头

{

hh++;

}

else

{

if (hh <= tt)

{

cout << “NO” << endl;

}

else

{

cout << “YES” << endl;

}

}

}

return 0;

}

STL

(1) push()

push(x)将x进行入队,时间复杂度为0(1).

(2)front()和back()

front()和back()可以分别获得队首元素和队尾元素,时间复杂度为O(1)

(3)pop()

pop()令队首元素出队,时间复杂度为O(1)。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

知其然不知其所以然,大厂常问面试技术如何复习?

1、热门面试题及答案大全

面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer

2、多线程、高并发、缓存入门到实战项目pdf书籍

3、文中提到面试题答案整理

4、Java核心知识面试宝典

覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入


《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入

[外链图片转存中…(img-VO0GgmoK-1713711945125)]

[外链图片转存中…(img-LeanPbpt-1713711945125)]

[外链图片转存中…(img-DOhKpmiK-1713711945125)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值