队列的概念
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
我们可以把队列理解成生活中排队做核酸的场景,站在第一个位置的人叫队头,站在最后一个位置的人叫队尾。出队就是做完核酸,入队就是来新的要做核酸的人,出队只能在队头出,即每次做核酸的只能是站在最前面的人做,入队要在队尾入,即后来者只能排在后面,不能进行插队。
链队列
使用链表实现的队列。
头指针:指向链表的头节点 尾指针:指向链表的最后一个节点 队空情况:头指针和尾指针指向同一位置
实现的操作概览
- 初始化队列
InitLinkQueue(LinkQueue &queue); - 销毁队列
DestroyLinkQueue(LinkQueue &queue); - 判断队列是否为空
LinkQueueEmpty(LinkQueue queue); - 获取队列的长度
LinkQueueLength(LinkQueue queue); - 获取队头元素
GetHead(LinkQueue queue, ElemType &e); - 清空队列
ClearLinkQueue(LinkQueue &queue); - 入队操作
EnLinkQueue(LinkQueue &queue, ElemType e); - 出队操作
DeLinkQueue(LinkQueue &queue, ElemType &e);
C代码实现
#include <stdio.h>
#include <cstdlib>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 5
typedef int Status;
typedef char ElemType;
typedef struct LinkQueueNode{
ElemType data;
struct LinkQueueNode *next;
}LinkQueueNode, *QueuePointer;
typedef struct{
QueuePointer front;
QueuePointer rear;
int length;
}LinkQueue;
Status InitLinkQueue(LinkQueue &queue);
Status DestroyLinkQueue(LinkQueue &queue);
Status LinkQueueEmpty(LinkQueue queue);
int LinkQueueLength(LinkQueue queue);
void GetHead(LinkQueue queue, ElemType &e);
Status ClearLinkQueue(LinkQueue &queue);
Status EnLinkQueue(LinkQueue &queue, ElemType e);
Status DeLinkQueue(LinkQueue &queue, ElemType &e);
int main(){
LinkQueue *queue = new LinkQueue;
InitLinkQueue(*queue);
ElemType e1 = 'a', e2 = 'b', e3 = 'c', e4 = 'd', e5 = 'e', e6 = 'f';
EnLinkQueue(*queue, e1);
EnLinkQueue(*queue, e2);
EnLinkQueue(*queue, e3);
EnLinkQueue(*queue, e4);
EnLinkQueue(*queue, e5);
EnLinkQueue(*queue, e6);
Status isEmpty = LinkQueueEmpty(*queue);
printf("队列是否为空:%d\n", isEmpty);
DeLinkQueue(*queue, e1);
printf("出队元素:%c\n", e1);
DeLinkQueue(*queue, e1);
printf("出队元素:%c\n", e1);
int length = LinkQueueLength(*queue);
printf("队列的长度:%d\n", length);
GetHead(*queue, e1);
printf("队列头元素:%c\n", e1);
ClearLinkQueue(*queue);
DeLinkQueue(*queue, e1);
DestroyLinkQueue(*queue);
}
Status InitLinkQueue(LinkQueue &queue){
LinkQueueNode *node = new LinkQueueNode;
node->next = NULL;
queue.front = queue.rear = node;
queue.length = 0;
return OK;
}
Status LinkQueueEmpty(LinkQueue queue){
return queue.length? FALSE: TRUE;
}
int LinkQueueLength(LinkQueue queue){
return queue.length;
}
Status ClearLinkQueue(LinkQueue &queue){
queue.rear = queue.front;
queue.length = 0;
return OK;
}
Status DestroyLinkQueue(LinkQueue &queue){
QueuePointer queuePointer = queue.front->next;
for(QueuePointer p = queuePointer; p; p=queuePointer){
queuePointer = queuePointer->next;
delete p;
}
queue.length = 0;
return OK;
}
void GetHead(LinkQueue queue, ElemType &e){
e = queue.front->next->data;
}
Status EnLinkQueue(LinkQueue &queue, ElemType e){
LinkQueueNode *node = new LinkQueueNode;
node->data = e;
node->next = NULL;
queue.rear->next = node;
queue.rear = node;
queue.length++;
return OK;
}
Status DeLinkQueue(LinkQueue &queue, ElemType &e){
if(queue.front == queue.rear){
printf("队列为空,出队失败!\n");
return ERROR;
}
LinkQueueNode *node = queue.front->next;
e = node->data;
queue.front->next = node->next;
delete node;
queue.length--;
return OK;
}
|