数据结构-----队列

news2024/11/24 7:45:49

目录

前言

队列

定义 

队列的定义和操作方法

 队列节点的定义

 操作方式

 顺序表实现队列(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,往后移动一位
	}
	else
		printf("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;
	}
	else
		printf("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 20

typedef 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.coloradmin.cn/o/1020802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

laravel框架 - 事件与监听器

一&#xff0c;绑定事件与监听器 在app\Providers下的EventServiceProvider.php中添加我们定义的事件与监听器 protected $listen [Registered::class > [SendEmailVerificationNotification::class,],App\ebvent\RegisterMessage>[//事件App\listeners\SendMessage//监…

【笔试强训选择题】Day43.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…

为什么qt设置了utf-8 bom 格式后还是有乱码

有乱码 void SingleApplication::_showInstanceRunningDialog() {// 创建一个提示窗口QMessageBox msgBox;msgBox.setIcon(QMessageBox::Information);msgBox.setWindowTitle("应用已运行");msgBox.setText("应用程序已经在运行中。");msgBox.setStandardB…

计算机毕业设计 基于SSM+Vue的医院门诊互联电子病历管理信息系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

GE PRG-MODEM 调节器模块

GE PRG-MODEM 调节器模块通常是工业自动化和控制系统中的一种通信设备&#xff0c;用于远程监测、控制和数据传输。以下是可能包括在该模块中的一些产品特点&#xff1a; 通信接口&#xff1a;PRG-MODEM 模块通常配备各种通信接口&#xff0c;例如串行接口&#xff08;RS-232、…

docker报错Error response from daemon: Container xxx is not running

1. 问题 在移植了docker后&#xff0c;执行了sudo docker run --name myrosort -p 80:80 -d rosort 指令运行名为myrosort的容器&#xff0c;通过sudo docker ps -a也可以看到确实运行了 (base) neousysneousys-Nuvo-5000:~/wqw/docker/20230915$ sudo docker run --name myr…

springboot基础--实现默认登录页面

1、搭建项目 依赖中 多加入thymeleaf依赖 <dependencies><!--thymeleaf的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--we…

每日一题~二叉搜索树中的众数

题目链接&#xff1a;501. 二叉搜索树中的众数 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 思路分析&#xff1a; 由题可知&#xff0c;题目中所给的树是一颗二叉搜索树&#xff0c;二叉搜索树的中序遍历结果是一个从小到大的数据集&#xff0c;那么我们可…

全国职业技能大赛云计算--高职组赛题卷④(容器云)

全国职业技能大赛云计算--高职组赛题卷④&#xff08;容器云&#xff09; 第二场次题目&#xff1a;容器云平台部署与运维任务1 Docker CE及私有仓库安装任务&#xff08;5分&#xff09;任务2 基于容器的web应用系统部署任务&#xff08;15分&#xff09;任务3 基于容器的持续…

计数排序与基数排序

计数排序与基数排序 计数排序 计数排序&#xff1a;使用一个数组记录序列中每一个数字出现的次数&#xff0c;将该数组的下标作为实际数据&#xff0c;元素的值作为数据出现的次数。例如对于序列[3,0,1,1,3,3,0,2]&#xff0c;统计的结果为&#xff1a; 0出现的次数&#xf…

【Linux】基础IO,软硬链接,动静态库

1. 认识IO 什么是IO I/O简单来说对应的就是两个单词Input和Output&#xff0c;指的是计算机系统与外部环境&#xff08;通常是硬件设备或其他计算机系统&#xff09;之间的数据交换过程 I/O 可以分为两种主要类型&#xff1a; 输入&#xff08;Input&#xff09;&#xff1a; …

生命周期简化idea配置

生命周期简图 扩展接口介绍 2.1 Aware接口 在spring中Aware接口表示的是感知接口&#xff0c;表示spring框架在Bean实例化过程中以回调的方式将特定在资源注入到Bean中去&#xff08;如&#xff1a;ApplicationContext, BeanName,BeanFactory等等&#xff09;。Aware接口本事没…

Java——break、continue(学习笔记)

1.break(主要与switch搭配使用) 在任何循环语句的主体部分&#xff0c;均可用break控制循环的流程。break用于强行退出循环&#xff0c;不执行循环中剩余的语句。 2.continue 用在循环语句体中&#xff0c;用于终止某次循环过程&#xff0c;即跳过循环体中尚未执行的语句&am…

u盘内容防止复制(U盘内数据防拷贝的方法)

随着科技的发展&#xff0c;U盘已经成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;U盘的普及也带来了一些问题&#xff0c;如数据泄露、病毒传播等。因此&#xff0c;保护U盘中的数据安全变得尤为重要。 方法一&#xff1a;设置文件权限 打开U盘&#xff0c;找到…

轻量级c语言开源日志库log.c介绍 - 实现不同级别和参数化日志打印

前言 c语言没有现成的日志库&#xff0c;如果要记录日志&#xff0c;需要自己封装一个日志库。如果要实现日志级别和参数打印&#xff0c;还是比较麻烦的&#xff0c;正好在github找到了一个c语言开源日志库&#xff0c;可以实现日志级别打印&#xff0c;参数打印&#xff0c;…

LVGL移植win端模拟显示流畅解决方案-使用 SquareLine 生成前端 UI 文件

lvgl_port_win_vscode 在 win 平台对 lvgl 方便的进行模拟显示&#xff0c;程序文件结构清晰&#xff0c;lvgl with SDL2&#xff0c;cmake 构建&#xff0c;VsCode 一键运行&#xff0c;使用 SquareLine 生成前端 UI 文件&#xff0c;win 上直接跑。 相比官方的 lvgl 移植到…

一百七十九、Linux——Linux报错No package epel-release available

一、目的 在Linux中配置Xmanager服务时&#xff0c;执行脚本时Linux报错No package epel-release available 二、解决措施 &#xff08;一&#xff09;第一步&#xff0c;# wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm &#xff08;二&…

@Validated 和 @Valid 的区别,你真的懂吗?SpringBoot 参数校验必知必会!

概述 Valid是使用Hibernate validation的时候使用Validated是只用Spring Validator校验机制使用 说明&#xff1a;java的JSR303声明了Valid这类接口&#xff0c;而Hibernate-validator对其进行了实现 Validation对Valid进行了二次封装&#xff0c;在使用上并没有区别&#xff…

水一下文章

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

zookeeper —— 分布式服务协调框架

zookeeper —— 分布式服务协调框架 一、Zookeeper概述1、Zookeeper的基本概念2、Zookeeper的特点3、Zookeeper的数据结构 二、Zookeeper的安装部署1、Zookeeper的下载2、Zookeeper的安装本地模式&#xff08;单机模式standalone&#xff09;安装部署分布式&#xff08;集群模式…