上一章节针对于C语言栈结构作了解析,不清楚的能够回顾一下。前端
本章节主要针对于C语言的基础数据结构队列作以解析。ios
队列是一种特殊的 线性表 ,特殊之处在于它只容许在表的前端(front)进行删除操做,而在表的后端(rear)进行插入操做,和栈同样,队列是一种操做受限制的线性表。进行插入操做的端称为队尾,进行删除操做的端称为队头。编程
故队列基本操做以下:后端
(1)建立队列数组
(2)入队微信
(3)出队数据结构
(4)判断队列是否为NULL函数
(5)获取队头元素学习
根据队列实现方式与出队方式,咱们能够把栈分为如下三种描述方式:测试
(1)原生数组队列
(2)动态申请内存的数组描述(普通队列和循环队列)
(3)链式结构描述
原生数组描述队列
数组描述栈,只不过多了先进先出的限制而已,它是静态分配的,即便用前,它的内存就已经以数组的形式分配好了,因此在使用时,须要注意队头队尾的标记。
原生数组描述队列实现试题案例:逆序整数
动态数组描述队列
动态申请内存的数组描述再也不采用上述实用性的方法了,而是经过封装相关队列函数去描述这种结构。这是写数据结构的一种大体方法。
1.结构体定义与队列的建立过程:
结构体定义:描述队列的属性:队头标记,队尾标记,队列空间
建立队列其实就是建立结构体变量
具体代码
ps:队头和队尾顶标记初始值通常都是-1 ,为了知足队列标记和数组下标一致
2.入队操做
注意: 咱们的实现是将最新的元素放在了数组的末尾, 那么数组末尾的元素就是咱们的队列队尾元素,故可使用队尾标记去计算队列中的元素个数。而后每次入队后,队尾标记日后移动。
具体实现代码:
3.出队操做和获取队头元素
注意: 出队操做应该是将队头元素删除,因为数组实现的队列没法删除,故只能把队头标记往队尾移动,简称为一种"伪删除"。
具体实现代码:
4.判断栈是否为空
用户判断栈中是否有元素,经过队尾和队头标记去作便可
具体实现代码:
动态申请内存的数组描述队列测试代码
ps:循环队列是经过取余造成的循环,这里不过多介绍,有兴趣的能够看看相关资料。
链式队列: 链表的尾插法便可
具体实现源码献上
#include <stdio.h> #include <stdlib.h> typedef struct { int data; struct Node* next; }NODE,*LPNODE; LPNODE createNode(int data) { LPNODE newNode = (LPNODE)malloc(sizeof(NODE)); newNode->data = data; newNode->next = NULL; return newNode; } typedef struct { int queueSize; LPNODE frontNode; LPNODE tailNode; }QUEUE,*LPQUEUE; LPQUEUE createQueue() { LPQUEUE queue = (LPQUEUE)malloc(sizeof(QUEUE)); queue->queueSize = 0; queue->frontNode = NULL; queue->tailNode = NULL; return queue; } void push(LPQUEUE queue, int data) { //无头表头链表的在封装法 LPNODE newNode = createNode(data); if (queue->queueSize == 0) { queue->frontNode = newNode; queue->tailNode = newNode; } else { //无表头链表的表尾插入 queue->tailNode->next = newNode; queue->tailNode = newNode; } queue->queueSize++; } //FILO +FIFO void pop(LPQUEUE queue) { if (queue->queueSize != 0) { LPNODE nextNode = queue->frontNode->next; free(queue->frontNode); queue->frontNode = nextNode; queue->queueSize--; } } int front(LPQUEUE queue) { return queue->frontNode->data; } int empty(LPQUEUE queue) { return queue->queueSize==0; } int size(LPQUEUE queue) { return queue->queueSize; } int main() { LPQUEUE queue = createQueue(); for (int i = 1; i <= 3; i++) { push(queue, i); } while (!empty(queue)) { printf("%d\t", front(queue)); pop(queue); } printf("\n"); system("pause"); return 0; }
优先队列:根据优先权去决定你出队的元素,故数据中存在优先权衡量的值,相关实现代码以下:
#include <iostream> #define MaxQueueSize 100 //队列的大小 //数据类型 数据自己 优先权 typedef int ElementType; //定义数据类型地 别名 //数据 结构体 typedef struct { int priority; //优先权---工做量 ElementType element;//队列中的元素 }DataType; //队列的结构体 typedef struct { int size; //结构体的嵌套 DataType Queue[MaxQueueSize]; }PriQueue; //读取文件做业---调度读取 //队列操做 //初始化---初始化基本成员 //size Queue void InitQueue(PriQueue *Q) { Q->size = 0; } //判断队列是否为空 NULL //和它的初始化比较 int QueueEmpty(PriQueue *Q) { // -> 指向运算符 C:结构体指针 C++: 类和结构体 // :: 做用域限定符 if (Q->size <= 0) return 0; //标志 else return 1; //不为空 // return 0 函数结束 } //入队 文件操做 int Push(PriQueue *Q, DataType data) { //入队前判断是否满 if (Q->size >= MaxQueueSize) { std::cout << "杯子已满,没法再倒水" << std::endl; return 0; } else { //Q->size=0; Q->Queue[Q->size] = data; //入队了队列长度就要增加 Q->size++; return 1; } } //出队 int Pop(PriQueue *Q, DataType *A) { DataType min; //最小的开始,排序 int minIndex = 0; //短做业优先法 //喝水,先判断杯子有没有水 if (Q->size <= 0) { std::cout << "为空,没法出队" << std::endl; return 0; } else { //假设第一个做业是最短的 min = Q->Queue[0]; //1 for (int i = 1; i < Q->size; i++) { //多了一个数据项 按照权值排序 //0 if (Q->Queue[i].priority < min.priority) { min = Q->Queue[i]; minIndex = i; //出队依据就是最小做业序号 } } *A = Q->Queue[minIndex]; //难点 //删除完数组后,后面的元素往前移动 for (int i = minIndex + 1; i < Q->size; i++) { Q->Queue[i - 1] = Q->Queue[i]; minIndex = i; } Q->size--; return 1; } } //获取队头元素 int GetQueue(PriQueue *Q, DataType *A) { DataType min; //最小的开始,排序 int minIndex = 0; //短做业优先法 //喝水,先判断杯子有没有水 if (Q->size <= 0) { std::cout << "为空,没法出队" << std::endl; return 0; } else { //假设第一个做业是最短的 min = Q->Queue[0]; //1 for (int i = 1; i < Q->size; i++) { //多了一个数据项 按照权值排序 //0 if (Q->Queue[i].priority < min.priority) { min = Q->Queue[i]; minIndex = i; //出队依据就是最小做业序号 } } *A = Q->Queue[minIndex]; return 1; } }
但愿对你们有帮助!
另外若是你想更好的提高你的编程能力,学好C语言C++编程!弯道超车,快人一步!
C语言C++编程学习交流圈子,QQ群1095293493【点击进入】微信公众号:C语言编程学习基地
分享(源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比本身琢磨更快哦!
编程学习软件分享:
编程学习视频分享: