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

数据结构-----队列

目录

前言

队列

定义 

队列的定义和操作方法

 队列节点的定义

 操作方式

 顺序表实现队列(C/C++代码)

链表实现队列(C/C++代码)

Python语言实现队列


前言

        排队是我们日常生活中必不可少的一件事,去饭堂打饭的时候排队,上公交车的时候排队等等,那排队的原则就是先到先得,排在前面的人先打饭,同样的在数据结构当中,有一种数据结构类型叫队列,其性质跟排队是一模一样的,下面我们就一起来看看吧!

队列

定义 

        队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

        队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表

 

队列可以通过顺序表实现和链表实现,下面就一起来看看吧!  

队列的定义和操作方法

 队列节点的定义

顺序表:

//队列定义
typedef struct queue {ElemType data[Maxsize];int front;//指向队头int rear;//指向队尾
}Queue;

链式:

//定义队列
typedef struct queue {int count;	//计数Node* front;//指向队头指针Node* rear;//指向队尾指针
}Queue;

 操作方式

void Queue_init(Queue* queue);//初始化bool isEmpty(Queue* queue);//判空bool isFull(Queue* queue);//判满void enQueue(Queue* queue, ElemType data);//入队Node* deQueue(Queue* queue);//出队int get_length(Queue* queue);//获取长度void travel_Queue(Queue* queue);//遍历(队头到队尾)void clear_Queue(Queue* queue);//清空销毁

 顺序表实现队列(C/C++代码)

#include <stdio.h>
#include<string.h>
#define Maxsize 20 //最大容量
//顺序表队列//节点数据
typedef struct data {int num;char name[10];
}ElemType;
//队列定义
typedef struct queue {ElemType data[Maxsize];int front;//指向队头int rear;//指向队尾
}Queue;//初始化
void queue_init(Queue* queue) {queue->front = 0;queue->rear = 0;
}//判断是否满队列
bool isFull(Queue* queue) {if (queue->rear == Maxsize) {printf("The queue is full\n");return true;}return false;
}//判断是否空队列
bool isEmpty(Queue* queue) {if (queue->rear == 0) {printf("The queue is etmpy\n");return true;}return false;
}//入队操作
void enQueue(Queue* queue, ElemType data) {if (!isFull(queue)) {//赋值queue->data[queue->rear].num = data.num;strcpy(queue->data[queue->rear].name, data.name);queue->rear++;	//队尾+1,往后移动一位}elseprintf("error\n");
}//出队操作
ElemType deQueue(Queue* queue) {ElemType de_data = { 0 };if (!isFull(queue)) {de_data = queue->data[queue->front];queue->front++;	//队头+1往后移动一位return de_data;}elseprintf("error\n");
}//遍历队列(从队头开始到队尾)
void travel_Queue(Queue* queue) {for (int i = queue->front; i < queue->rear; i++) {printf("%d %s\n", queue->data[i].num, queue->data[i].name);}printf("printf over!\n");
}//获取队列长度
int get_Queuelength(Queue* queue) {return queue->rear-queue->front;
}//清空队列
void clear_Queue(Queue* queue) {queue_init(queue);//直接恢复出厂设置
}int main(void)
{Queue queue;queue_init(&queue);ElemType data[4] = { {15,"fuck"},{16,"wdf"},{17,"wtmc"},{18,"cnmb"} };for (int i = 0; i < 4;i++) {enQueue(&queue, data[i]);}deQueue(&queue);travel_Queue(&queue);
}//16 wdf
//17 wtmc
//18 cnmb
//printf over!

链表实现队列(C/C++代码)

#include<stdio.h>
#include<string.h>
#include <stdbool.h>
#include<stdlib.h>
#include<assert.h>
#define Maxsize 20typedef struct datatype {int num;char name[10];
}ElemType;
//定义节点
typedef struct node {ElemType data;struct node* next;
}Node;
//定义队列
typedef struct queue {int count;	//计数Node* front;//指向队头指针Node* rear;//指向队尾指针
}Queue;void Queue_init(Queue* queue);//初始化
bool isEmpty(Queue* queue);//判空
bool isFull(Queue* queue);//判满
void enQueue(Queue* queue, ElemType data);//入队
Node* deQueue(Queue* queue);//出队
int get_length(Queue* queue);//获取长度
void travel_Queue(Queue* queue);//遍历
void clear_Queue(Queue* queue);//清空销毁int main()
{Queue myqueue;Queue_init(&myqueue);ElemType data[4] = { {15,"a"},{16,"wb"},{17,"htt"},{18,"jk"} };for (int i = 0; i < 4; i++) {enQueue(&myqueue, data[i]);}deQueue(&myqueue);travel_Queue(&myqueue);
}
//16 wb
//17 htt
//18 jk
//Printf over//初始化
void Queue_init(Queue* queue) {assert(queue);queue->front = NULL;queue->rear = NULL;queue->count=0;
}//创建节点
Node* create_node(ElemType data) {Node* new_node = (Node*)malloc(sizeof(Node));if (new_node) {new_node->data = data;new_node->next = NULL;return new_node;}else{printf("ERRPR\n");}
}//判断是否空队列
bool isEmpty(Queue* queue) {assert(queue);if (queue->count == 0){printf("The queue is etmpy\n");return true;}return false;
}//判断是否满队列
bool isFull(Queue* queue) {assert(queue);if (queue->count == Maxsize) {printf("The queue is full\n");return true;}return false;
}//入队
void enQueue(Queue* queue, ElemType data) {assert(queue);if (!isFull(queue)) {Node* new_node = create_node(data);//如果队尾指向空的时候,也就是队列为空时if (queue->rear == NULL) {queue->front = new_node;queue->rear = new_node;queue->count++;}//当队列不为空的时候else{queue->rear->next = new_node;queue->rear = new_node;queue->count++;}}else{printf("error\n");}
}//出队
Node* deQueue(Queue* queue) {assert(queue);if (!isEmpty(queue)) {Node* deNode = queue->front;queue->front = deNode->next;queue->count--;return deNode;}printf("error\n");return NULL;
}//获取队列长度
int get_length(Queue* queue) {assert(queue);return queue->count;
}//遍历队列
void travel_Queue(Queue* queue) {assert(queue);Node* cur = queue->front;while (cur) {printf("%d %s\n", cur->data.num, cur->data.name);cur = cur->next;}printf("Printf over\n");
}//清空队列
void clear_Queue(Queue* queue) {assert(queue);Node* cur = queue->front;while (cur) {//要把每一个节点的空间都释放,避免内存泄漏Node* p = cur->next;    //获取到当前节点的下一个节点free(cur);cur = p;}printf("Clear successfully!\n");
}

Python语言实现队列

链接:Python数据结构-----队列_python队列_灰勒塔德的博客-CSDN博客

 以上就是今天的全部内容了,我们下一期再见!!!

分享一张壁纸:

http://www.lryc.cn/news/169680.html

相关文章:

  • postgresql教程
  • 1万6千多最好的背单词SQLITE\ACCESS数据库
  • springboot aop Aspectj 切面
  • Leetcode 2862. Maximum Element-Sum of a Complete Subset of Indices
  • 第一百四十七回 自定义组件一
  • MySQL 重复数据的处理
  • Java文字描边效果实现
  • 【Web_环境搭建_Python3_pip】pip的升级、安装、更新、卸载,以及pipupgrade和pip-review的基础使用
  • 农民朋友有福利啦!建行江门市分行“裕农通+农资结算”平台正式上线
  • super详解
  • GMS地下水数值模拟丨GMS各模块、三维地质模型构建及与MODFLOW耦合、地下水流动数值模拟及报告编制、地下水溶质运移模型、反应性溶质运移等
  • Redis 配置文件详解 - 持久化(RDB、AOF)
  • 在线Excel转JSON工具
  • Spring编程常见错误50例-Spring Bean依赖注入常见错误(下)
  • SpringBoot整合Canal实现MySQL与ES数据同步
  • Zookeeper 源码分析流程
  • 计数排序与基数排序
  • Mysql—表操作
  • SpringCloud——微服务
  • 深入理解Java单例模式和优化多线程任务处理
  • 已解决 Kotlin Error: Type mismatch: inferred type is String but Int was expected
  • Web应用系统的小安全漏洞及相应的攻击方式
  • git工具下载和安装
  • 腾讯mini项目-【指标监控服务重构】2023-08-04
  • 怎么推广自己抖店的商品?最适合0经验新手操作的办法,来看看
  • 线性代数的本质(三)——线性方程组
  • 轻量级性能测试工具 wrk 如何使用?
  • WebGL 视图矩阵、模型视图矩阵
  • Python 3 – 文件 readline() 方法
  • 如何在微软Edge浏览器上一键观看高清视频?