顺序队列的基本操作(入队出队遍历)及C/C++代码实现
创作时间:
作者:
@小白创作中心
顺序队列的基本操作(入队出队遍历)及C/C++代码实现
引用
1
来源
1.
https://www.dotcpp.com/course/106
顺序队列是一种常见的数据结构,其基本操作包括入队、出队和遍历。本文将详细介绍这些操作的原理和C/C++代码实现。
1. 入队操作
在进行入队(push)操作时,首先需要判断队列是否为空。如果队列为空,需要将头指针和尾指针一同指向第一个结点;如果队列不为空,则只需要将尾结点向后移动。
代码实现如下:
//入队操作
void push(queue *q, int data){
node *n = init_node();
n->data = data;
n->next = NULL; //采用尾插入法
if (empty(q)){
q->front = n;
q->rear = n;
} else {
q->rear->next = n; //n成为当前尾结点的下一结点
q->rear = n; //让尾指针指向n
}
}
2. 出队操作
出队(pop)操作需要在队列不为空的情况下进行。如果队列只有一个元素,需要将头尾指针制空并释放该结点;如果队列含有两个以上元素,则将队列的头指针指向下一个元素并释放当前元素。
代码实现如下:
//出队操作
void pop(queue *q){
node *n = q->front;
if (empty(q)){
return; //此时队列为空,直接返回函数结束
}
if (q->front == q->rear){
q->front = NULL; //只有一个元素时直接将两端指向制空即可
q->rear = NULL;
free(n); //记得归还内存空间
} else {
q->front = q->front->next;
free(n);
}
}
3. 打印队列元素(遍历)
遍历队列元素需要在队列不为空的情况下,通过结点的next指针依次遍历并输出元素。
代码实现如下:
//打印队列元素
void print_queue(queue *q){
node *n = init_node();
n = q->front;
if (empty(q)){
return; //此时队列为空,直接返回函数结束
}
while (n != NULL){
printf("%d\t", n->data);
n = n->next;
}
printf("\n"); //记得换行
}
此外,遍历操作还可以用于计算队列中元素的数量:
int calac(queue *q){
node *n = init_node();
n = q->front;
int cnt = 0; //计数器设计
if (empty(q)){
return 0; //此时队列为空,直接返回函数结束
}
while (n != NULL){
n = n->next;
cnt++;
}
return cnt;
}
4. 代码实现
完整的代码实现如下:
#include <stdio.h>
#include <stdlib.h>
//结点定义
typedef struct node{
int data;
struct node *next;
}node;
//队列定义,队首指针和队尾指针
typedef struct queue{
node *front;
node *rear;
}queue;
//初始化结点
node *init_node(){
node *n = (node*)malloc(sizeof(node));
if (n == NULL){ //建立失败,退出
exit(0);
}
return n;
}
//初始化队列
queue *init_queue(){
queue *q = (queue*)malloc(sizeof(queue));
if (q == NULL){ //建立失败,退出
exit(0);
}
//头尾结点均赋值NULL
q->front = NULL;
q->rear = NULL;
return q;
}
//队列判空
int empty(queue *q){
if (q->front == NULL){
return 1; //1--表示真,说明队列非空
} else {
return 0; //0--表示假,说明队列为空
}
}
//入队操作
void push(queue *q, int data){
node *n = init_node();
n->data = data;
n->next = NULL; //采用尾插入法
if (empty(q)){
q->front = n;
q->rear = n;
} else {
q->rear->next = n; //n成为当前尾结点的下一结点
q->rear = n; //让尾指针指向n
}
}
//出队操作
void pop(queue *q){
node *n = q->front;
if (empty(q)){
return; //此时队列为空,直接返回函数结束
}
if (q->front == q->rear){
q->front = NULL; //只有一个元素时直接将两端指向制空即可
q->rear = NULL;
free(n); //记得归还内存空间
} else {
q->front = q->front->next;
free(n);
}
}
//打印队列元素
void print_queue(queue *q){
node *n = init_node();
n = q->front;
if (empty(q)){
return; //此时队列为空,直接返回函数结束
}
while (n != NULL){
printf("%d\t", n->data);
n = n->next;
}
printf("\n"); //记得换行
}
//主函数调用,这里只是简单介绍用法
int main(){
queue *q = init_queue();
/////////////入队操作/////////////////
printf("入队\n");
for (int i = 1; i <= 5; i++){
push(q, i);
print_queue(q);
}
/////////////出队操作/////////////////
printf("出队\n");
for (int i = 1; i <= 5; i++){
pop(q);
print_queue(q);
}
return 0;
}
5. 配套题目推荐
对于基本的操作,可以同链表的题目测试,自定义一些数据集来测试。此外,队列的操作在很多算法设计中都会使用到,尤其是BFS(广度优先搜索)算法的设计和一些图论的算法设计几乎无法离开各种类型的队列的灵活使用。
对于本样例代码,建议将队列元素数量设计入结构体中,这样每次询问队列中含有多少元素时就不必再进行遍历。
热门推荐
生成式AI技术快速发展带来多重挑战
《教父2》首章:战火中崛起的两代传奇——维多与麦克·柯里昂
行至第11年,追光动画距离“中国皮克斯”还有多远?
心理学中的行为分析
二战菲律宾战役:60万日军战死5万惨死45万,美军咋样虐打日军?
医院客户关系管理系统如何提升服务质量与患者满意度?
麒麟操作系统深度解析:从技术到应用的全面指南
深入探索Docker数据卷:实现容器持久化存储的完美方案(下)
资产配置完全指南:从基础概念到实战策略
龙逍遥竟是言少哲的父亲,那为何言少哲从小会在史莱克学院呢?
研究发现保持积极心态的人,注定人生经历与众不同
杨绛先生说:“真正的爱,不是改变对方,而是一起成长”
美国F-1签证新规,留学生又遇身份危机?
意大利文艺复兴艺术的特点
自律:塑造高效能人士的必备品质
从吃饺子到祭祖:冬至的北方与南方习俗差异
人生规划和目标架构的关键步骤是什么?
挤压页面:分步教程模板
如何查看电脑网速及提升网络速度的实用技巧与方法
便秘怎么办?吃什么可以帮助排便?6个解决便秘的方法
昆明公交推出26条观光巴士春游线路,涵盖一日游和多日游
印度佛教艺术的传承与演变
常见的社交媒体有哪些,社交媒体平台有哪些类型和特点?
网络谣言的危害与应对:以赵雅芝去世传闻为例
小拇指关节痛的原因及应对方法
如何全面了解五险一金的相关内容?这些内容有哪些实际作用?
以最惊艳文字写最美七绝?星星鬓角小花黄,是对人生最好的诠释!
连锁门店运营管理的具体内容(门店运营管理的深度解析)
GDP再被重庆“反超”:广州“掉队”了吗?
卡帕多西亚:土耳其的童话之地