【数据结构】队列(顺序队列、循环队列、链队列)

文章目录

前言

队列也是一种线性表,其特殊性在于队列的基本操作是线性表的子集。队列按“先进先出”的规则进行操作,故称其为操作受限的线性表。


一、队列的定义

队列(queue)是只允许在一端进行插入操作,在另一端进行删除操作的线性表,简称“队”。

队列是一种先进先出(First In First Out)的线性表,简称FIFO。

允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)

向队列中插入新的数据元素称为入队,新入队的元素就成为了队列的队尾元素。

从队列中删除队头元素称为出队,其后继元素成为新的队头元素。


二、队列的顺序存储结构

队列作为一种特殊的线性表,也同样存在两种存储结构:顺序存储结构和链式存储结构,可以分别用数组和链表来实现队列。

1.顺序队列的定义

用一组地址连续的存储单元,依次存放从队头到队尾的数据元素,称为顺序队列

需要附设两个指针:队头指针(front)队尾指针(rear)

顺序队列的实现: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 // 队列的最大长度 typedef struct{ int data[MAXSIZE]; int front; // 队头指针,指向队头元素 int rear; // 队尾指针,指向队尾元素的后一个位置 }SqQueue; // 初始化队列 void InitQueue(SqQueue *Q){ Q->front = 0; Q->rear = 0; } // 判断队列是否为空 int IsEmptyQueue(SqQueue Q){ if(Q.front == Q.rear) return 1; else return 0; } // 判断队列是否已满 int IsFullQueue(SqQueue Q){ if((Q.rear+1)%MAXSIZE == Q.front) return 1; else return 0; } // 入队 int EnQueue(SqQueue *Q, int data){ if(IsFullQueue(*Q)){ printf("Queue is full\n"); return 0; } Q->data[Q->rear] = data; Q->rear = (Q->rear+1)%MAXSIZE; return 1; } // 出队 int DeQueue(SqQueue *Q, int *data){ if(IsEmptyQueue(*Q)){ printf("Queue is empty\n"); return 0; } *data = Q->data[Q->front]; Q->front = (Q->front+1)%MAXSIZE; return 1; } // 输出队列 void PrintQueue(SqQueue Q){ if(IsEmptyQueue(Q)){ printf("Queue is empty\n"); return; } int i = Q.front; while(i != Q.rear){ printf("%d ", Q.data[i]); i = (i+1)%MAXSIZE; } printf("\n"); } int main(){ SqQueue Q; // 声明一个队列 InitQueue(&Q); // 初始化队列 int flag = 1, choice, data; while(flag){ // 循环操作 printf("1. EnQueue\n"); printf("2. DeQueue\n"); printf("3. PrintQueue\n"); printf("0. Exit\n"); printf("Enter your choice: "); scanf("%d", &choice); switch(choice){ case 0: flag = 0; break; case 1: printf("Enter data to Enqueue: "); scanf("%d", &data); if(EnQueue(&Q, data)) printf("Enqueue %d successfully!\n", data); break; case 2: if(DeQueue(&Q, &data)) printf("Dequeue %d successfully!\n", data); break; case 3: PrintQueue(Q); break; default: printf("Invalid choice\n"); } } return 0; } ``` 队列的实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node{ // 队列结点的定义 int data; struct Node *next; }Node, *pNode; typedef struct{ // 队列的定义 pNode front; // 队头指针 pNode rear; // 队尾指针 }LinkQueue; // 初始化队列 void InitQueue(LinkQueue *Q){ Q->front = Q->rear = (pNode)malloc(sizeof(Node)); Q->front->next = NULL; } // 判断队列是否为空 int IsEmptyQueue(LinkQueue Q){ if(Q.front == Q.rear) return 1; else return 0; } // 入队 void EnQueue(LinkQueue *Q, int data){ pNode p; p = (pNode)malloc(sizeof(Node)); p->data = data; p->next = NULL; Q->rear->next = p; Q->rear = p; } // 出队 int DeQueue(LinkQueue *Q, int *data){ if(IsEmptyQueue(*Q)){ printf("Queue is empty\n"); return 0; } pNode p = Q->front->next; *data = p->data; Q->front->next = p->next; if(Q->rear == p) // 如果队列中只有一个元素 Q->rear = Q->front; free(p); return 1; } // 输出队列 void PrintQueue(LinkQueue Q){ if(IsEmptyQueue(Q)){ printf("Queue is empty\n"); return; } pNode p = Q.front->next; while(p){ printf("%d ", p->data); p = p->next; } printf("\n"); } int main(){ LinkQueue Q; // 声明一个队列 InitQueue(&Q); // 初始化队列 int flag = 1, choice, data; while(flag){ // 循环操作 printf("1. EnQueue\n"); printf("2. DeQueue\n"); printf("3. PrintQueue\n"); printf("0. Exit\n"); printf("Enter your choice: "); scanf("%d", &choice); switch(choice){ case 0: flag = 0; break; case 1: printf("Enter data to Enqueue: "); scanf("%d", &data); EnQueue(&Q, data); printf("Enqueue %d successfully!\n", data); break; case 2: if(DeQueue(&Q, &data)) printf("Dequeue %d successfully!\n", data); break; case 3: PrintQueue(Q); break; default: printf("Invalid choice\n"); } } return 0; } ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值