顺序队列的基本操作(入队出队遍历)及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(广度优先搜索)算法的设计和一些图论的算法设计几乎无法离开各种类型的队列的灵活使用。
对于本样例代码,建议将队列元素数量设计入结构体中,这样每次询问队列中含有多少元素时就不必再进行遍历。
热门推荐
“迎风流泪”为哪般?本文为你详解
什么是专线IP(什么是专线供电线路)
婚姻幸福的关键(如何实现婚姻幸福)
项目管理中常见的十大陷阱及应对策略
转项目管理岗怎么转的
一勺猪油等于五副药?糖尿病人常吃猪油是好还是坏?建议了解
再现1800多年前“张飞巡城”,他在阆中古城扮演“猛张飞”丨非遗春节
孩子使用手机的利弊有哪些
高血压病的科普小知识
学 C/C++ 具体能干什么?
你的牛奶,它过敏吗?
申请书怎么写?三步走,写一份令人无法拒绝的申请书
时序论文18|ICML24 :复旦&微软团队提出基于脉冲网络的时序预测新思路
内开窗飘窗帘的安装:实用技巧与材料选择详细指南
电热水壶功率有多大?使用注意事项全解析
构建高效安全的数据库异地备份方案
NBA全明星首发:詹杜库领衔文班亚马落选 老詹21次入选刷新纪录
正则化技术与自适应优化算法在AIGC图像生成中的应用与进展
虎皮鹦鹉的饲养要点
潮汕地区发展:从农业到现代经济的转型之路
万千光芒照亮未来之路 网络文明建设硕果累累
欧洲足坛风云变幻:五大联赛近期综述
如何挑选最佳时间采摘玉竹(掌握四季特点,了解最佳收获时间)
怎么锁定Word单元格,防止内容更改
因业制宜、精准施策,提升新就业群体就业质量
消灭家中常见昆虫的 10 种天然方法
CNC精雕机加工刀具选择全攻略:五大维度科学选刀
读博士可以得哪些奖
类固醇药膏怎么用?注意这6大类固醇副作用
在家打造游戏厅,三个方法让家里的电视机变身游戏机