数据结构---队列
以下内容只是学习记录:
一、定义
队列是一种先进先出的线性表。在表的一端进行插入(队尾),另一端删除元素(对头)实现形式有:顺序队列(顺序表实现)和链式队列(链式表实现)
二、代码编写
1、链队列实现:
结构体定义及功能函数声明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #ifndef __LINKQUEUE_H__ #define __LINKQUEUE_H__ #include <stdio.h> #include "malloc.h" #include "assert.h" #define ElemType int typedef struct QueueNode { ElemType data; struct QueueNode *next; }QueueNode; typedef struct LinkQueue { QueueNode *front; QueueNode *tail; }LinkQueue; void InitQueue(LinkQueue *p); void EnQueue(LinkQueue *p, ElemType x); void ShowQueue(LinkQueue *p); void DeQueue(LinkQueue *p); void GetHead(LinkQueue *p, ElemType *v); int Length(LinkQueue *p); void ClearQueue(LinkQueue *p); void DestroyQueue(LinkQueue *p); #endif |
功能函数编写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #include "LinkQueue.h" void InitQueue(LinkQueue *p) { QueueNode *s = (QueueNode *) malloc ( sizeof (QueueNode)); s->data = 0; assert (s != NULL); p->front = p->tail = s; p->tail->next = NULL; } void EnQueue(LinkQueue *p, ElemType x) { QueueNode *s = (QueueNode *) malloc ( sizeof (QueueNode)); assert (s != NULL); s->data = x; s->next = NULL; p->tail->next = s; p->tail = s; p->front->data++; } void ShowQueue(LinkQueue *p) { QueueNode *s = p->front->next; printf ( "Front->" ); while (s != NULL) { printf ( "%d->" , s->data); s = s->next; } printf ( "Tail\n" ); } void DeQueue(LinkQueue *p) { if (p->front == p->tail) return ; QueueNode *s = p->front->next; p->front->next = s->next; free (s); s = NULL; if (p->front->next == NULL) p->tail = p->front; p->front->data--; } void GetHead(LinkQueue *p, ElemType *v) { if (p->front == p->tail) return ; QueueNode *s = p->front->next; *v = s->data; } int Length(LinkQueue *p) { return p->front->data; } void ClearQueue(LinkQueue *p) { if (p->front == p->tail) return ; QueueNode *s = p->front->next; while (s != NULL) { p->front->next = s->next; free (s); s = p->front->next; } p->tail = p->front; p->front->data = 0; } void DestroyQueue(LinkQueue *p) { ClearQueue(p); free (p->front); p->tail = p->front = NULL; } |
Main函数编写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include "LinkQueue.h" void main() { LinkQueue Q; InitQueue(&Q); ElemType elem; for ( int i = 1; i <= 10; ++i) { EnQueue(&Q, i); } ShowQueue(&Q); DeQueue(&Q); ShowQueue(&Q); GetHead(&Q, &elem); printf ( "队头元素:%d\n" , elem); ClearQueue(&Q); int len = Length(&Q); printf ( "队列长度为:%d" , len); } |
2、顺序队列实现
结构体定义及功能函数声明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #ifndef __SEQQUEUE_H__ #define __SEQQUEUE_H__ #include "stdio.h" #include "malloc.h" #include "assert.h" #define ElemType int #define MAXSIZE 8 typedef struct Queue { ElemType *base; int front; int rear; }Queue; void InitQueue(Queue *Q); void EnQueue(Queue *Q, ElemType x); void Show(Queue *Q); void DeQueue(Queue *Q); int Length(Queue *Q); void GetHead(Queue *Q, ElemType *v); void ClearQueue(Queue *Q); void DestroyQueue(Queue *Q); #endif |
功能函数编写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include "SeqQueue.h" void InitQueue(Queue *Q) { Q->base = (ElemType *) malloc ( sizeof (ElemType) * MAXSIZE); assert (Q->base != NULL); Q->front = Q->rear = 0; } void EnQueue(Queue *Q, ElemType x) { if (Q->rear >= MAXSIZE) return ; Q->base[Q->rear++] = x; } void Show(Queue *Q) { for ( int i = Q->front; i < Q->rear; i++) { printf ( "%d " ,Q->base[i]); } printf ( "\n" ); } void DeQueue(Queue *Q) { if (Q->front == Q->rear) return ; Q->front++; } int Length(Queue *Q) { return Q->rear - Q->front; } void GetHead(Queue *Q, ElemType *v) { if (Q->front == Q->rear) return ; *v = Q->base[Q->front]; } void ClearQueue(Queue *Q) { Q->front = Q->rear = 0; } void DestroyQueue(Queue *Q) { free (Q->base); Q->base = NULL; } |
Main函数编写:
#include "SeqQueue.h" void main() { Queue Q; InitQueue(&Q); for (int i = 1; i <= 5; i++) { EnQueue(&Q, i); } Show(&Q); DeQueue(&Q); Show(&Q); int len = Length(&Q); printf("长度为:%d", len); }
3、循环队列实现
基础概念:
输入自然数:x
周期:n
x%n的取值范围:0~n-1
结构体定义及功能函数声明:

#ifndef __CSEQQUEUE_H__ #define __CSEQQUEUE_H__ #include "stdio.h" #include "malloc.h" #include "assert.h" #define ElemType int #define MAXSIZE 8 typedef struct Queue { ElemType *base; int front; int rear; }Queue; void InitQueue(Queue *Q); void EnQueue(Queue *Q, ElemType x); void Show(Queue *Q); void DeQueue(Queue *Q); int Length(Queue *Q); void GetHead(Queue *Q, ElemType *v); void ClearQueue(Queue *Q); void DestroyQueue(Queue *Q); #endif
功能函数编写:
#include "CSeqQueue.h" void InitQueue(Queue *Q) { Q->base = (ElemType *)malloc(sizeof(ElemType) * MAXSIZE); assert(Q->base != NULL); Q->front = Q->rear = 0; } void EnQueue(Queue *Q, ElemType x) { if ((Q->rear + 1) % MAXSIZE == Q->front) return; Q->base[Q->rear] = x; Q->rear = (Q->rear + 1) % MAXSIZE; } void Show(Queue *Q) { for (int i = Q->front; i != Q->rear;) { printf("%d ", Q->base[i]); i = (i + 1) % MAXSIZE; } printf("\n"); } void DeQueue(Queue *Q) { if (Q->front == Q->rear) return; Q->front = (Q->front + 1) % MAXSIZE; } int Length(Queue *Q) { return (Q->rear - Q->front + MAXSIZE) % MAXSIZE; } void GetHead(Queue *Q, ElemType *v) { if (Q->front == Q->rear) return; *v = Q->base[Q->front]; } void ClearQueue(Queue *Q) { Q->front = Q->rear = 0; } void DestroyQueue(Queue *Q) { free(Q->base); Q->base = NULL; }
Main函数编写:
#include "CSeqQueue.h" void main() { Queue Q; InitQueue(&Q); for (int i = 1; i <=10; i++) { EnQueue(&Q, i); } Show(&Q); DeQueue(&Q); EnQueue(&Q, 99); Show(&Q); /*int len = Length(&Q); printf("长度为:%d", len);*/ }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!