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;
}