C语言实现队列

本文介绍了队列的基本概念,其特点是先进先出(FIFO),与栈的主要区别在于删除位置和应用场景。文章还提供了C语言实现队列的相关代码。

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

1.什么是队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
2.队列有什么特性?
先进先出,如同现实中的排队
3.栈和队列有什么区别?

1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。
2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。
3.顺序栈能够实现多栈空间共享,而顺序队列不能。

//头文件

#pragma once 
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>


typedef int QDataType;
typedef struct QNode
{
	struct QNode* _pNext;
	QDataType _data;
}QNode;

typedef struct Queue
{
	QNode* _front; // 指向队头元素
	QNode* _back; // 指向队尾元素
	int Q_size;//队列的有效元素
}Queue;

//队列的初始化
void QueueInit(Queue* q);
//入队列
void QueuePush(Queue* q, QDataType data);
//出队列
void QueuePop(Queue* q);
//返回对头元素
QDataType QueueFront(Queue* q);
//返回队尾元素
QDataType QueueBack(Queue* q);
//返回队列有效元素个数
int QueueSize(Queue* q);
//判断队列是否为空
int QueueEmpty(Queue* q);
//销毁队列
void QueueDestroy(Queue* q);

//实现文件

#include "Queue.h"

QNode* BuyQNode(QDataType data) {
	QNode* newNode = (QNode*)malloc(sizeof(QNode));
	newNode->_data = data;
	newNode->_pNext = NULL;
	return newNode;
}
//队列的初始化
void QueueInit(Queue* q) {
	if (q == NULL) {
		return;
	}
	q->_front = NULL;
	q->_back = NULL;
	q->Q_size = 0;
}
//入队列
void QueuePush(Queue* q, QDataType data) {
	if (q == NULL) {
		return;
	}
	QNode* newnode=BuyQNode(data);

	if(q->_front==NULL&&q->_back==NULL) {
		q->_front = newnode;
		q->_back = newnode;
	}
	q->_back->_pNext = newnode;
	q->_back = newnode;
	q->Q_size++;
}
//出队列
void QueuePop(Queue* q) {
	if (q == NULL) {
		return;
	}
	if (q->_front == NULL) {
		printf("队列为空\n");
		return;
	}
	//保存第一个元素
	QNode* pCur = q->_front;
	//把队列的头往后移动
	q->_front = q->_front->_pNext;
	//释放已经出队列的结点
	free(pCur);
	--q->Q_size;
}
//返回对头元素
QDataType QueueFront(Queue* q) {
	if (q == NULL) {
		return	0;
	}
	if (q->_front == NULL) {
		printf("队列为空\n");
		return 0;
	}
	return q->_front->_data;
}
//返回队尾元素
QDataType QueueBack(Queue* q) {
	if (q == NULL) {
		return 0;
	}
	return q->_back->_data;
}
//返回队列有效元素个数
int QueueSize(Queue* q) {
	if (q == NULL) {
		return 0;
	}
	return q->Q_size;
}
//判断队列是否为空
int QueueEmpty(Queue* q) {
	if (q == NULL) {
		return 0;
	}
	if (q->_front == NULL) {
		return 0;
	}
	return 1;
}
//销毁队列
void QueueDestroy(Queue* q) {
	if (q == NULL) {
		return;
	}
	for (int i = 0; i < q->Q_size; ++i) {
		QNode* pCur = q->_front;
		q->_front = pCur->_pNext;
		free(pCur);
		pCur = NULL;
	}
}

//测试文件

#include "Queue.h"


int main() {
	Queue Q;
	QueueInit(&Q);
	QueuePush(&Q, 1);
	QueuePush(&Q, 2);
	QueuePush(&Q, 3);
	QueuePush(&Q, 4);
	QueuePush(&Q, 5);
	QueuePop(&Q);
	int front = QueueFront(&Q);
	int back = QueueBack(&Q);
	int size = QueueSize(&Q);
	printf("front==%d\n", front);
	printf("back==%d\n", back);
	printf("size==%d\n", size);
	QueueDestroy(&Q);
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值