数据结构之普通队列C语言版(简单易懂)

本文介绍了如何使用C语言实现普通队列,包括结构体封装、初始化、判断队列状态、入队、出队等操作。通过实例展示了队列的先进先出特性,并修复了在判断队列状态时的潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构之普通队列C语言版

什么是普通队列

队列是一种数据结构,是用来存储数据的,普通队列是队列里最简单的,也比较好理解。操作和栈是差不多的。队列和栈的区别就是,栈是先进后出,队列是先进先出。然后就没有多大的区别了。

简单使用C语言实现普通队列

队列的基本概念就这么多,想深入了解概念的请看课本去。这里是使用编程语言来实现队列的。

前期准备

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define MAXSIZE 10

主要是包含是头文件,然后是预定义一个最大容量。

结构体封装

要实现一个数据结构首先是知道数据结构的样子是什么,然后画出来,然后对应的内容就使用对应的数据类型封装,在C语言中,就使用结构体来封装队列的各个组件。

队列的基本样子:
在这里插入图片描述

从图中可以看到的是队列有队头和队尾,所以使用两个标记去表示,left靠队头这边,right靠队尾这边。那就开始封装吧。

typedef struct Queue
{
   
	int elem[MAXSIZE];
	int left;
	int right;
	int curSize;
}Queue,*pQueue;

typedef是取别名:

typedef struct Queue Queue		//Queue是struct Queue的别名
typedef struct Queue* pQueue	//pQueue是struct Queue*的别名

初始化队列

pQueue creatQueue()
{
   
	pQueue head = (pQueue)malloc(sizeof(Queue));
	assert(head);
	head->left = -1;
	head->right = -1;
	head->curSize = 0;
	return head;
}

left和right一开始都初始化为-1方便等下操控elem数组。这里的初始化很随意,不过就是等下实现源代码的时候会做一些改变。问题不是很大。在堆区申请的内存,在函数结束后不会释放。

判断队列是否为空

int empty(pQueue head)
{
   
	if (head->curSize == 0)
	{
   
		head->left = -1;
		head->right = -1;
		return 1;
	}
	return 0;
}

这里之前有个BUG,重新去实现C++STL中的queue才发现的。现在已经改过来了。
之前empty的代码我写成的是下面的样子:

int empty(pQueue head)
{
   
	return head->curSize==0;
}

之所以说它有BUG是因为在后面的pop函数实现的时候,pop函数里面要判断curSize成员是否为0,为0就将left和right赋值为-1(就是回到最初的状态)。但是到了测试下面的方式打印的时候,会有问题。

while(!empty(head))
{
   
	printf("%d "
#include #include #include //队列最大长度 #define MAX_QUEUE 1024 //偷懒,就用静态队列了 static int mQueue[MAX_QUEUE]; //队列插入 void InsertData(int **Front, int **Rear) { if (*Rear + 1 == *Front && (*Rear + 1 - MAX_QUEUE != *Front)) { //当队列数据已满,返回 puts("Queue Size Overflow!\n"); return; } else if (*Rear - mQueue > MAX_QUEUE) { //实现的是类似循环队列,但由于是静态线性队列(数组) //而不是用链表来实现的,所以到静态队列(数组)尾部,尾指针自动指向(数组)头部 *Rear = mQueue; } puts("Input Data:"); scanf("%d", *Rear); //输入数据后,尾指针后移 *Rear += 1; } //从头指针删除一个队列中的数据 void DeleteData(int **Front, int **Rear) { if (*Front == *Rear) { //头指针尾指针重合,队列空,不能删除,返回 puts("Queue Empty!\n"); return; } else if (*Front - mQueue > MAX_QUEUE) { //参考 Rear *Front = mQueue; } //从头指针删除一个数据 *Front += 1; } //显示队列数据 void ShowData(int **Front, int **Rear) { int *temp; for (temp=*Front; temp!=*Rear; temp++) { printf("%d --> ", *temp); } puts("\n"); } void usage(void) { puts("1. Insert Data"); puts("2. Delete Data"); puts("3. Show Data"); } int main(int argc, char **argv) { //头指针,尾指针 //队列的一个特性 First in first out FIFO int *pFront, *pRear; int op_code; //初始化队列,头指针和尾指针此时指向的地址相同 pFront = pRear = mQueue; while (1) { usage(); scanf("%d", &op_code); switch (op_code) { case 1: printf("%p\n", pFront); printf("%d\n", *pFront); InsertData(&pFront, &pRear); break; case 2: DeleteData(&pFront, &pRear); break; case 3: ShowData(&pFront, &pRear); break; default: break; } } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值