队列数据结构详解:从原理到实现
定义
队列(queue)是一种先进先出(First In First Out, FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。在队列中,允许插入的一端称为队尾(rear),允许删除的一端则称为队头(front)。假设队列为 q = (a1, a2, …, an),那么,a1 就是队头元素,an 就是队尾元素。队列中的元素是按照 a1, a2, …, an 的顺序进入的,退出队列也只能按照这个次序依次退出,也就是说,只有在 a1, a2, …, an-1 都离开队列之后,an 才能退出队列。
队列的顺序结构
普通队列
实现
#define MAXSIZE 100
typedef int ElemType;
typedef struct
{ ElemType data[MAXSIZE]; int front; int rear;
}Queue;
初始化
#define MAXSIZE 100
typedef int ElemType;
typedef struct
{ ElemType data[MAXSIZE]; int front; int rear;
}Queue;
void initQueue(Queue *Q)
{ Q->front = 0; Q->rear = 0;
}
判断队列是否为空
int isEmpty(Queue *Q)
{ if (Q->front == Q->rear) { printf("空的\n"); return 1; } else { return 0;}
}
出队
ElemType dequeue(Queue *Q)
{ if (Q->front == Q->rear) { printf("空的\n"); return 0; } ElemType e = Q->data[Q->front]; Q->front++; return e;
}
入队
int equeue(Queue *Q, ElemType e)
{ if (Q->rear >= MAXSIZE) { if(!queueFull(Q)) { return 0; } } Q->data[Q->rear] = e; Q->rear++; return 1;
}
调整队列
int queueFull(Queue *Q)
{if (Q->front > 0){int step = Q->front;for (int i = Q->front; i <= Q->rear; ++i){Q->data[i - step] = Q->data[i];}Q->front = 0;Q->rear = Q->rear - step;return 1;}else{printf("真的满了\n");return 0;}
}
获取队头数据
int getHead(Queue *Q, ElemType *e)
{if (Q->front == Q->rear){printf("空的\n");return 0;}*e = Q->data[Q->front];return 1;
}
完整可运行代码
#include<stdio.h>;#define MAXSIZE 100
typedef int ElemType;typedef struct
{ElemType data[MAXSIZE];int front;int rear;}Queue;//初始化
void initQueue(Queue *Q)
{Q->front = 0;Q->rear = 0;
}//判断队列是否为空
int isEmpty(Queue *Q)
{if (Q->front == Q->rear){printf("空的\n");return 1;}else{return 0; }
}//出队
ElemType dequeue(Queue *Q)
{if (Q->front == Q->rear){printf("空的\n");return 0;}ElemType e = Q->data[Q->front];Q->front++;return e;
}
//队尾满了,调整队列
int queueFull(Queue *Q)
{if (Q->front > 0){int step = Q->front;for (int i = Q->front; i <= Q->rear; ++i){Q->data[i - step] = Q->data[i];}Q->front = 0;Q->rear = Q->rear - step;return 1;}else{printf("真的满了\n");return 0;}
}//入队
int equeue(Queue *Q, ElemType e)
{if (Q->rear >= MAXSIZE){if(!queueFull(Q)){return 0;}}Q->data[Q->rear] = e;Q->rear++;return 1;
}//获取队头元素
int getHead(Queue *Q, ElemType *e)
{if (Q->front == Q->rear){printf("空的\n");return 0;}*e = Q->data[Q->front];return 1;
}int main(int argc, char const *argv[])
{Queue q;initQueue(&q);equeue(&q, 10);equeue(&q, 20);equeue(&q, 30);equeue(&q, 40);equeue(&q, 50);printf("%d\n",dequeue(&q));printf("%d\n",dequeue(&q));ElemType e;getHead(&q, &e);printf("%d\n",e);return 0;
}
动态内存分配
typedef struct
{ ElemType *data; int front; int rear;
}Queue;
Queue* initQueue()
{ Queue *q = (Queue*)malloc(sizeof(Queue)); q->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE); q->front = 0; q->rear = 0; return q;
}
可运行全代码
#include<stdio.h>;
#include<stdlib.h>;#define MAXSIZE 100
typedef int ElemType;typedef struct
{ElemType *data;int front;int rear;}Queue;//初始化
Queue* initQueue()
{Queue *q = (Queue*)malloc(sizeof(Queue));q->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);q->front = 0;q->rear = 0;return q;
}//判断队列是否为空
int isEmpty(Queue *Q)
{if (Q->front == Q->rear){printf("空的\n");return 1;}else{return 0; }
}//出队
ElemType dequeue(Queue *Q)
{if (Q->front == Q->rear){printf("空的\n");return 0;}ElemType e = Q->data[Q->front];Q->front++;return e;
}
//队尾满了,调整队列
int queueFull(Queue *Q)
{if (Q->front > 0){int step = Q->front;for (int i = Q->front; i <= Q->rear; ++i){Q->data[i - step] = Q->data[i];}Q->front = 0;Q->rear = Q->rear - step;return 1;}else{printf("真的满了\n");return 0;}
}//入队
int equeue(Queue *Q, ElemType e)
{if (Q->rear >= MAXSIZE){if(!queueFull(Q)){return 0;}}Q->data[Q->rear] = e;Q->rear++;return 1;
}//获取队头元素
int getHead(Queue *Q, ElemType *e)
{if (Q->front == Q->rear){printf("空的\n");return 0;}*e = Q->data[Q->front];return 1;
}
int main(int argc, char const *argv[])
{Queue *q = initQueue();equeue(q, 10);equeue(q, 20);equeue(q, 30);equeue(q, 40);equeue(q, 50);printf("%d\n",dequeue(q));printf("%d\n",dequeue(q));ElemType e;getHead(q, &e);printf("%d\n",e);return 0;
}
循环队列
入队
int equeue(Queue *Q, ElemType e)
{if ((Q->rear + 1) % MAXSIZE == Q->front){printf("满了\n");return 0;}Q->data[Q->rear] = e;Q->rear = (Q->rear + 1) % MAXSIZE;return 1;
}
出队
int dequeue(Queue *Q, ElemType *e)
{ if (Q->front == Q->rear) { printf("空的\n"); return 0; } *e = Q->data[Q->front]; Q->front = (Q->front + 1) % MAXSIZE;return 1;
}
可运行全代码
#include<stdio.h>;
#include<stdlib.h>;#define MAXSIZE 100
typedef int ElemType;typedef struct
{ElemType *data;int front;int rear;}Queue;//初始化
Queue* initQueue()
{Queue *q = (Queue*)malloc(sizeof(Queue));q->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);q->front = 0;q->rear = 0;return q;
}//判断队列是否为空
int isEmpty(Queue *Q)
{if (Q->front == Q->rear){printf("空的\n");return 1;}else{return 0; }
}//入队
int equeue(Queue *Q, ElemType e)
{if ((Q->rear + 1) % MAXSIZE == Q->front){printf("满了\n");return 0;}Q->data[Q->rear] = e;Q->rear = (Q->rear + 1) % MAXSIZE;return 1;
}//出队
int dequeue(Queue *Q, ElemType *e)
{if (Q->front == Q->rear){printf("空的\n");return 0;}*e = Q->data[Q->front];Q->front = (Q->front + 1) % MAXSIZE;return 1;
}//获取队头元素
int getHead(Queue *Q, ElemType *e)
{if (Q->front == Q->rear){printf("空的\n");return 0;}*e = Q->data[Q->front];return 1;
}int main(int argc, char const *argv[])
{Queue *q = initQueue();equeue(q, 10);equeue(q, 20);equeue(q, 30);equeue(q, 40);equeue(q, 50);ElemType e;dequeue(q, &e);printf("%d\n",e);dequeue(q, &e);printf("%d\n",e);getHead(q, &e);printf("%d\n",e);return 0;
}
队列的链式结构
实现
typedef struct QueueNode
{ElemType data;struct QueueNode *next;
}QueueNode;typedef struct
{QueueNode *front;QueueNode *rear;
}Queue;
初始化
Queue* initQueue()
{Queue *q = (Queue*)malloc(sizeof(Queue));QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode));node->data = 0;node->next = NULL;q->front = node;q->rear = node;return q;
}
判断队列是否为空
int isEmpty(Queue *q)
{if (q->front == q->rear){return 1;}else{return 0;}
}
入队
void equeue(Queue *q, ElemType e)
{QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode));node->data = e;node->next = NULL;q->rear->next = node;q->rear = node;
}
出队
int dequeue(Queue *q, ElemType *e)
{if (isEmpty(q)){printf("空的\n");return 0;}QueueNode *node = q->front->next;*e = node->data;q->front->next = node->next;if (q->rear == node){q->rear = q->front;}free(node);return 1;
}
获取队头元素
ElemType getFront(Queue *q)
{if (isEmpty(q)){printf("空的\n");return 0;}return q->front->next->data;
}
可运行全代码
#include<stdio.h>;
#include<stdlib.h>;typedef int ElemType;typedef struct QueueNode
{ElemType data;struct QueueNode *next;
}QueueNode;typedef struct
{QueueNode *front;QueueNode *rear;
}Queue;//初始化
Queue* initQueue()
{Queue *q = (Queue*)malloc(sizeof(Queue));QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode));node->data = 0;node->next = NULL;q->front = node;q->rear = node;return q;
}//判断队列是否为空为空
int isEmpty(Queue *q)
{if (q->front == q->rear){return 1;}else{return 0;}
}//入队
void equeue(Queue *q, ElemType e)
{QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode));node->data = e;node->next = NULL;q->rear->next = node;q->rear = node;
}//出队
int dequeue(Queue *q, ElemType *e)
{if (isEmpty(q)){printf("空的\n");return 0;}QueueNode *node = q->front->next;*e = node->data;q->front->next = node->next;if (q->rear == node){q->rear = q->front;}free(node);return 1;
}//获取队头元素
ElemType getFront(Queue *q)
{if (isEmpty(q)){printf("空的\n");return 0;}return q->front->next->data;
}int main(int argc, char const *argv[])
{Queue *q = initQueue();equeue(q, 10);equeue(q, 20);equeue(q, 30);equeue(q, 40);equeue(q, 50);ElemType e;dequeue(q, &e);printf("出队%d\n", e);dequeue(q, &e);printf("出队%d\n", e);printf("%d\n", getFront(q));return 0;
}