当前位置: 首页 > news >正文

队列数据结构详解:从原理到实现

定义

队列(queue)是一种先进先出(First In First Out, FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。在队列中,允许插入的一端称为队尾(rear),允许删除的一端则称为队头(front)。假设队列为 q = (a1, a2, …, an),那么,a1 就是队头元素,an 就是队尾元素。队列中的元素是按照 a1, a2, …, an 的顺序进入的,退出队列也只能按照这个次序依次退出,也就是说,只有在 a1, a2, …, an-1 都离开队列之后,an 才能退出队列。

队列的顺序结构

普通队列

实现

#define MAXSIZE 100 
typedef int ElemType; 
typedef struct 
{ ElemType data[MAXSIZE]; int front; int rear; 
}Queue;

初始化

#define MAXSIZE 100 
typedef int ElemType; 
typedef struct 
{ ElemType data[MAXSIZE]; int front; int rear; 
}Queue; 
void initQueue(Queue *Q) 
{ Q->front = 0; Q->rear = 0; 
}

判断队列是否为空

int isEmpty(Queue *Q) 
{ if (Q->front == Q->rear) { printf("空的\n"); return 1; } else { return 0;} 
}

出队

ElemType dequeue(Queue *Q) 
{ if (Q->front == Q->rear) { printf("空的\n"); return 0; } ElemType e = Q->data[Q->front]; Q->front++; return e; 
}

入队

int equeue(Queue *Q, ElemType e) 
{ if (Q->rear >= MAXSIZE) { if(!queueFull(Q)) { return 0; } } Q->data[Q->rear] = e; Q->rear++; return 1; 
}

调整队列

int queueFull(Queue *Q)
{if (Q->front > 0){int step = Q->front;for (int i = Q->front; i <= Q->rear; ++i){Q->data[i - step] = Q->data[i];}Q->front = 0;Q->rear = Q->rear - step;return 1;}else{printf("真的满了\n");return 0;}
}

获取队头数据

int getHead(Queue *Q, ElemType *e)
{if (Q->front == Q->rear){printf("空的\n");return 0;}*e = Q->data[Q->front];return 1;
}

完整可运行代码

#include<stdio.h>;#define MAXSIZE 100
typedef int ElemType;typedef struct 
{ElemType data[MAXSIZE];int front;int rear;}Queue;//初始化
void initQueue(Queue *Q)
{Q->front = 0;Q->rear = 0;
}//判断队列是否为空
int isEmpty(Queue *Q)
{if (Q->front == Q->rear){printf("空的\n");return 1;}else{return 0;	}
}//出队
ElemType dequeue(Queue *Q)
{if (Q->front == Q->rear){printf("空的\n");return 0;}ElemType e = Q->data[Q->front];Q->front++;return e;
}
//队尾满了,调整队列
int queueFull(Queue *Q)
{if (Q->front > 0){int step = Q->front;for (int i = Q->front; i <= Q->rear; ++i){Q->data[i - step] = Q->data[i];}Q->front = 0;Q->rear = Q->rear - step;return 1;}else{printf("真的满了\n");return 0;}
}//入队
int equeue(Queue *Q, ElemType e)
{if (Q->rear >= MAXSIZE){if(!queueFull(Q)){return 0;}}Q->data[Q->rear] = e;Q->rear++;return 1;
}//获取队头元素
int getHead(Queue *Q, ElemType *e)
{if (Q->front == Q->rear){printf("空的\n");return 0;}*e = Q->data[Q->front];return 1;
}int main(int argc, char const *argv[])
{Queue q;initQueue(&q);equeue(&q, 10);equeue(&q, 20);equeue(&q, 30);equeue(&q, 40);equeue(&q, 50);printf("%d\n",dequeue(&q));printf("%d\n",dequeue(&q));ElemType e;getHead(&q, &e);printf("%d\n",e);return 0;
}

动态内存分配

typedef struct 
{ ElemType *data; int front; int rear;
}Queue; 
Queue* initQueue() 
{ Queue *q = (Queue*)malloc(sizeof(Queue)); q->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE); q->front = 0; q->rear = 0; return q; 
}

可运行全代码

#include<stdio.h>;
#include<stdlib.h>;#define MAXSIZE 100
typedef int ElemType;typedef struct 
{ElemType *data;int front;int rear;}Queue;//初始化
Queue* initQueue()
{Queue *q = (Queue*)malloc(sizeof(Queue));q->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);q->front = 0;q->rear = 0;return q;
}//判断队列是否为空
int isEmpty(Queue *Q)
{if (Q->front == Q->rear){printf("空的\n");return 1;}else{return 0;	}
}//出队
ElemType dequeue(Queue *Q)
{if (Q->front == Q->rear){printf("空的\n");return 0;}ElemType e = Q->data[Q->front];Q->front++;return e;
}
//队尾满了,调整队列
int queueFull(Queue *Q)
{if (Q->front > 0){int step = Q->front;for (int i = Q->front; i <= Q->rear; ++i){Q->data[i - step] = Q->data[i];}Q->front = 0;Q->rear = Q->rear - step;return 1;}else{printf("真的满了\n");return 0;}
}//入队
int equeue(Queue *Q, ElemType e)
{if (Q->rear >= MAXSIZE){if(!queueFull(Q)){return 0;}}Q->data[Q->rear] = e;Q->rear++;return 1;
}//获取队头元素
int getHead(Queue *Q, ElemType *e)
{if (Q->front == Q->rear){printf("空的\n");return 0;}*e = Q->data[Q->front];return 1;
}
int main(int argc, char const *argv[])
{Queue *q = initQueue();equeue(q, 10);equeue(q, 20);equeue(q, 30);equeue(q, 40);equeue(q, 50);printf("%d\n",dequeue(q));printf("%d\n",dequeue(q));ElemType e;getHead(q, &e);printf("%d\n",e);return 0;
}

循环队列

入队

int equeue(Queue *Q, ElemType e)
{if ((Q->rear + 1) % MAXSIZE == Q->front){printf("满了\n");return 0;}Q->data[Q->rear] = e;Q->rear = (Q->rear + 1) % MAXSIZE;return 1;
}

出队

int dequeue(Queue *Q, ElemType *e) 
{ if (Q->front == Q->rear) { printf("空的\n"); return 0; } *e = Q->data[Q->front]; Q->front = (Q->front + 1) % MAXSIZE;return 1; 
}

可运行全代码

#include<stdio.h>;
#include<stdlib.h>;#define MAXSIZE 100
typedef int ElemType;typedef struct 
{ElemType *data;int front;int rear;}Queue;//初始化
Queue* initQueue()
{Queue *q = (Queue*)malloc(sizeof(Queue));q->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);q->front = 0;q->rear = 0;return q;
}//判断队列是否为空
int isEmpty(Queue *Q)
{if (Q->front == Q->rear){printf("空的\n");return 1;}else{return 0;	}
}//入队
int equeue(Queue *Q, ElemType e)
{if ((Q->rear + 1) % MAXSIZE == Q->front){printf("满了\n");return 0;}Q->data[Q->rear] = e;Q->rear = (Q->rear + 1) % MAXSIZE;return 1;
}//出队
int dequeue(Queue *Q, ElemType *e)
{if (Q->front == Q->rear){printf("空的\n");return 0;}*e = Q->data[Q->front];Q->front = (Q->front + 1) % MAXSIZE;return 1;
}//获取队头元素
int getHead(Queue *Q, ElemType *e)
{if (Q->front == Q->rear){printf("空的\n");return 0;}*e = Q->data[Q->front];return 1;
}int main(int argc, char const *argv[])
{Queue *q = initQueue();equeue(q, 10);equeue(q, 20);equeue(q, 30);equeue(q, 40);equeue(q, 50);ElemType e;dequeue(q, &e);printf("%d\n",e);dequeue(q, &e);printf("%d\n",e);getHead(q, &e);printf("%d\n",e);return 0;
}

队列的链式结构

实现

typedef struct QueueNode
{ElemType data;struct QueueNode *next;
}QueueNode;typedef struct 
{QueueNode *front;QueueNode *rear;
}Queue;

初始化

Queue* initQueue()
{Queue *q = (Queue*)malloc(sizeof(Queue));QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode));node->data = 0;node->next = NULL;q->front = node;q->rear = node;return q;
}

判断队列是否为空

int isEmpty(Queue *q)
{if (q->front == q->rear){return 1;}else{return 0;}
}

入队

void equeue(Queue *q, ElemType e)
{QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode));node->data = e;node->next = NULL;q->rear->next = node;q->rear = node;
}

出队

int dequeue(Queue *q, ElemType *e)
{if (isEmpty(q)){printf("空的\n");return 0;}QueueNode *node = q->front->next;*e = node->data;q->front->next = node->next;if (q->rear == node){q->rear = q->front;}free(node);return 1;
}

获取队头元素

ElemType getFront(Queue *q)
{if (isEmpty(q)){printf("空的\n");return 0;}return q->front->next->data;
}

可运行全代码

#include<stdio.h>;
#include<stdlib.h>;typedef int ElemType;typedef struct QueueNode
{ElemType data;struct QueueNode *next;
}QueueNode;typedef struct 
{QueueNode *front;QueueNode *rear;
}Queue;//初始化
Queue* initQueue()
{Queue *q = (Queue*)malloc(sizeof(Queue));QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode));node->data = 0;node->next = NULL;q->front = node;q->rear = node;return q;
}//判断队列是否为空为空
int isEmpty(Queue *q)
{if (q->front == q->rear){return 1;}else{return 0;}
}//入队
void equeue(Queue *q, ElemType e)
{QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode));node->data = e;node->next = NULL;q->rear->next = node;q->rear = node;
}//出队
int dequeue(Queue *q, ElemType *e)
{if (isEmpty(q)){printf("空的\n");return 0;}QueueNode *node = q->front->next;*e = node->data;q->front->next = node->next;if (q->rear == node){q->rear = q->front;}free(node);return 1;
}//获取队头元素
ElemType getFront(Queue *q)
{if (isEmpty(q)){printf("空的\n");return 0;}return q->front->next->data;
}int main(int argc, char const *argv[])
{Queue *q = initQueue();equeue(q, 10);equeue(q, 20);equeue(q, 30);equeue(q, 40);equeue(q, 50);ElemType e;dequeue(q, &e);printf("出队%d\n", e);dequeue(q, &e);printf("出队%d\n", e);printf("%d\n", getFront(q));return 0;
}

http://www.dtcms.com/a/481906.html

相关文章:

  • JavaScript构造函数详解
  • 学习无刷直流电机驱动硬件
  • 案例应聘网络营销做网站推广网络营销的种类有哪些
  • 西安网站建设网莱芜网站推广
  • 从RNN到LSTM:深入理解循环神经网络与长短期记忆网络
  • AIDL 接口的定义与生成,使用
  • 深度解析过拟合与欠拟合:从诊断到正则化策略的全面应对
  • python - 装箱项目/3D Bin Packing problem
  • 【自动驾驶】自动驾驶概述 ⑨ ( 自动驾驶软件系统概述 | 预测系统 | 决策规划 | 控制系统 )
  • STM32F103C8T6 GY-906 MLX90614ESF 无线测温传感器模块的使用方法和代码驱动
  • 常规的紫外工业镜头有哪些?能做什么?
  • 香洲网站建设品牌形象设计方案
  • 突破AR视觉交互边界:Unity赋能Rokid AR眼镜实现高精度图像识别与实时跟踪
  • zabbix安装
  • 【VTK实战】vtkDepthImageToPointCloud:从2D深度图到3D点云,手把手教你落地3D扫描/AR场景
  • 【Git版本控制】Git初识、安装、仓库初始化与仓库配置(含git init、git config与配置无法取消问题)
  • 浅谈目前主流的LLM软件技术栈:Kubernetes + Ray + PyTorch + vLLM 的协同架构
  • 北京企业建站团队30岁转行做网站编辑
  • Kubernetes云平台管理实战:滚动升级与秒级回滚
  • 苹果智能眼镜研发进度更新,三星/微美全息提速推进AI+AR产业化进程
  • vue3+ts+uniapp微信小程序xr-frame实现AR追踪器(ARTracker)
  • Git分支合并文件丢失问题解决教程
  • GESP2025年9月认证C++四级( 第三部分编程题(2)最长连续段)
  • 花都建设局网站成都网站设计龙兵科技
  • OpenCV Python 绑定:原理与实战
  • flutter布局调试
  • Linux下运行Jmeter
  • 矩阵快速幂
  • DeviceNet转Modbus TCP网关:破解水利工程协议互联壁垒
  • 仿搜狐视频网站源码网页设计做网站