首页 > 其他分享 >顺序表实现队列(c语言)

顺序表实现队列(c语言)

时间:2024-07-19 19:30:06浏览次数:12  
标签:顺序 语言 队列 queue int elements front rear

队列


建议你在看这篇文章先看一下 顺序表知识
我在这里通过顺序表的写法实现 先进先出的特征来实现队列。当然顺序表也可以实现栈,感兴趣的朋友可以看 顺序表实现栈

概念篇

在这里插入图片描述

图示

在这里插入图片描述

代码篇

1. 队列的声明

把一些属性封装起来表示队列。
因为有队首和队尾索引,所以就不需要size成员了。
q->rear-q->front==size;
typedef struct queue
{
	int front;
	//队头索引
	int rear;
	//队尾索引
	int*elements;
	int capacity;
}queue;

2.队列的创建

初始化时,队头索引和队尾索引设置为0,为数组分配内存空间
void queue_creat(queue*q)
{
	q->elements=(int*)malloc(sizeof(int)*8);
	/*在这里我为栈分配足够的内存以存储8个整数,
	也可以不是8,但不能是零
	*/
	q->front=q->rear=0;
	//最开始队列为空,所以队头索引和队首索引都为0
	q->capacity=8;
}

3.队列的销毁

释放生成的内存空间,初始化队首和队尾索引,elements指针指向空。
void queue_destroy(queue*q)
{
	free(q->elements);
	q->front=q->rear=0;
	q->capacity=0;
	q->elements=NULL;
	//防止野指针
}

4.队列扩容

当队列满时需要扩容,用顺序表实现队列通常都需要扩容。
void queue_expand(queue*q)
{
	int *newelements=(int*)realloc(q->elements,sizeof(int)*q->capacity*2);
	//倍数是任意的根据具体情况而定
	if(newelements=NULL)
        exit(1);
     //内存分配失败时,终止程序进行。
     q->elements=newelements;
     q->capacity*=2;
}

5.入列

从队尾索引位置插入元素
void queue_push(queue*q,int value)
{
	if(q->rear-q->front==q->capacity)
		queue_expand(&q);
	q->elements[q->rear++]=value;
}

6.出列

每次都删除的是队头索引对应的元素
int queue_pop(queue*q)
{
	if(q->rear==q->front)
	{	
		printf("queue is empty!");
		exit(1);
	}
	return q->elements[q->front++];
}

6.队首元素

int queue_front(queue*q)
{
	return q->elements[q->front];
}

7.队列的元素个数

int queue_size(queue*q)
{
	return q->rear-q->front;
}

完整代码

#include<stdio.h>
#include<stdlib.h>
typedef struct queue
{
	int front;
	//队头索引
	int rear;
	//队尾索引
	int*elements;
	int capacity;
}queue;
void queue_creat(queue*q)
{
	q->elements=(int*)malloc(sizeof(int)*8);
	/*在这里我为栈分配足够的内存以存储8个整数,
	也可以不是8,但不能是零
	*/
	q->front=q->rear=0;
	//最开始队列为空,所以队头索引和队首索引都为0
	q->capacity=8;
}
void queue_destroy(queue*q)
{
	free(q->elements);
	q->front=q->rear=0;
	q->capacity=0;
	q->elements=NULL;
	//防止野指针
}
void queue_expand(queue*q)
{
	int*newelements=(int*)realloc(q->elements,sizeof(int)*q->capacity*2);
	//倍数是任意的根据具体情况而定
	if(newelements=NULL)
        exit(1);
     //内存分配失败时,终止程序进行。
     q->elements=newelements;
     q->capacity*=2;
}
void queue_push(queue*q,int value)
{
	if(q->rear-q->front==q->capacity)
		queue_expand(&q);
	q->elements[q->rear++]=value;
}
int queue_pop(queue*q)
{
	if(q->rear==q->front)
	{	
		printf("queue is empty!");
		exit(1);
	}
	return q->elements[q->front++];
}
int queue_front(queue*q)
{
	return q->elements[q->front];
}
int queue_size(queue*q)
{
	return q->rear-q->front;
}
int main()
{
    queue q;
    queue_creat(&q);
    queue_push(&q,10);
    queue_push(&q,20);
    queue_push(&q,30);
    //在队尾插入,所以顺序为:
    /* 10 20 30 
     队头    队尾
    */
    printf("q size is:%d\n",queue_size(&q));
    //q size is :3
    printf("q pop is:%d\n",queue_pop(&q));
    //队头删除,10
    printf("q front is:%d\n",queue_front(&q));
    /* 20 30 
     队头 队尾
    */
    //q front is 20
    printf("q size is:%d\n",queue_size(&q));
    //q size is:2
    queue_destroy(&q);
    return 0;
}

运行结果

在这里插入图片描述
在下一篇文章中,我将会写如何用链表实现栈,感兴趣的朋友可以先看一下链表的知识链表实现栈这两篇文章

标签:顺序,语言,队列,queue,int,elements,front,rear
From: https://blog.csdn.net/2301_79893984/article/details/140534767

相关文章

  • 线性表——链表(c语言)
    链表概念篇示意图1.单向链表2.双向链表3.循环链表4.链表的元素插入5.链表的元素删除代码篇1.链表的定义2.链表的创建3.链表的销毁4.链表的元素插入5.链表的元素删除6.链表的元素查找7.链表下标对应的结点8.链表元素的修改9.链表的打印10.完整代码代码运行效果概......
  • 【c语言】日日练-通讯录
    通讯录题目解析(实现过程+要点)代码test.c(测试功能)contact.c(通讯录相关的实现)contact.h(通讯录相关的声明)题目实现一个通讯录,人的信息包括(姓名、年龄、性别、电话、地址)实现功能:1、存放100个人的信息2、增加联系人3、删除指定联系人4、查找联系人5、修改联系......
  • 深入理解淘客返利系统中的异步消息处理与队列技术
    深入理解淘客返利系统中的异步消息处理与队列技术大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代的淘客返利系统中,高并发和复杂的业务需求要求我们采用异步消息处理和队列技术来提高系统的性能和可伸缩性。本文将深入探讨在淘客返利系统中如......
  • 使用Java和RabbitMQ构建消息队列系统
    使用Java和RabbitMQ构建消息队列系统大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨如何使用Java和RabbitMQ构建一个高效的消息队列系统。RabbitMQ是一个开源的消息中间件,支持多种消息协议,能够帮助我们实现异步处理和解耦。1.Rabbit......
  • 微调 Florence-2 - 微软的尖端视觉语言模型
    微调Florence-2-微软的尖端视觉语言模型 Florence-2是微软于2024年6月发布的一个基础视觉语言模型。该模型极具吸引力,因为它尺寸很小(0.2B及0.7B)且在各种计算机视觉和视觉语言任务上表现出色。Florence开箱即用支持多种类型的任务,包括:看图说话、目标检测、O......
  • C语言运算符
    1.算术运算符+加法-减法*乘法/除法%取余 计算时,数据类型不一样的不能直接运算,需要转换成一样的才能运算,有两种转换方式。1.1隐式转换把一个取值范围小的,转换为取值范围大的,隐式转换是计算机自己就可以完成的,不会产生错误的。数据类型从大的到小的顺序为:double>float>lon......
  • C语言函数详解
    函数的概念不同于数学上的函数,在C语言中,函数(function)就是一个完成某项特定任务的一段代码,所以函数也叫子程序。函数的分类库函数为了提高写代码的效率,C语言的国际标准ANSIC规定了一些常用的函数的标准,被称为标准库。不同的编译器厂商根据ANSI提供的标准就给出了一系列函数......
  • Datawhale AI 夏令营 task2语言包陷入困境
     一、了解机器翻译在运行task1时,我仅仅只是按照教程一步步走下去,不理解每一步的意义,也不懂什么叫做机器翻译。于是在task2中碰了壁。1.机器翻译的含义机器翻译(MT)是自然语言处理领域的一个重要分支,其目标是将一种语言的文本自动转换为另一种语言的文本。机器翻译的发展经历......
  • C语言基础(二)
    数据类型    数据类型介绍:            整型类型来描述整数,字符类型来描述字符,浮点型类型来描述小数;    字符型:char//character[signed]char//有符号的unsignedchar//⽆符号的    整型://短整型short[int][signed]s......
  • C语言基础(四)
    printf库函数基本用法:printf()的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的f代表format(格式化),表⽰可以定制输出⽂本的格式。#include<stdio.h>intmain(){printf("Hello,world");return0;}printf()不会在行尾自动添加换行符,运行结束后,光标就停留在输......