前言:
我们生活中排队模型的特点是,最早进入队伍的元素最早离开。本节提出队列来描述类似排队的结构模型。
目录:
1、栈
2、栈的应用举例
3、栈与递归的实现
4、队列
5、离散事件模型
正文:
队列的定义:
和栈相反,队列(queue)是一种先进先出(first in first out, FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。在队列中,允许插入的一端就做队尾(rear),允许删除的一端称为队头(front)。
双端队列:
双端队列是限定插入和删除操作在表的两端进行的线性表。(一种限制性的数据结构)
队列的链式表示和实现:
用链表表示的队列简称为 链队列 。一个链队列显然需要两个分别指向队头 和 队尾 的指针(分别称为头指针 和 尾指针)。这里和单链表一样,为了方便也给队列添加一个头结点。
队列示意图:
单链队列的存储结构:
//结点定义
typedef struct QNode{
ElemType data; //单链表中结点的数据域
struct QNode *next; //结点的指针域
}QNode;
//队列链定义
typedef struct{
QNode *front; //队头指针
QNode *rare; //队尾指针
}LinkQueue;
代码实现:
#include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //Status是函数的类型,其值是函数结果状态码 typedef int Status; typedef int ElemType; //结点定义 typedef struct QNode{ ElemType data; //单链表中结点的数据域 struct QNode *next; //结点的指针域 }QNode; //队列链定义 typedef struct{ QNode *front; //队头指针 QNode *rare; //队尾指针 }LinkQueue; //初始化一个空队列 Status InitQueue(LinkQueue &Q){ Q.front=Q.rare=(QNode *)malloc(sizeof(QNode)); if(!Q.front) exit(OVERFLOW); Q.front->next=NULL; return OK; } //判断是否为空队列 Status QueueEmpty(LinkQueue &Q){ if(Q.front==Q.rare) return TRUE; return FALSE; } //判断长度 Status QueueLength(LinkQueue &Q){ if(Q.front==Q.rare) return 0; int i=0; QNode *q=Q.front; while(q->next){ q=q->next; i++; } return i; } //向队列尾部插入元素e Status EnQueue(LinkQueue &Q,ElemType e){ //生成 结点 QNode *q; //指向新生成的结点 q=(QNode *)malloc(sizeof(QNode)); if(!q) exit(OVERFLOW); q->data=e; q->next=NULL; Q.rare->next=q; Q.rare=q; return OK; } //删除队列头部元素并返回 Status DeQueue(LinkQueue &Q,ElemType &e){ if(Q.front==Q.rare) return ERROR; QNode *q=Q.front->next; e=Q.front->next->data; Q.front->next=Q.front->next->next; if(!Q.front->next) Q.rare=Q.front; free(q); return OK; } void printV(LinkQueue &Q){ if(Q.front==Q.rare) printf("%s ","空队列"); QNode *q=Q.front; while(q->next){ printf("地址:%p",q->next); printf("值:%d ",q->next->data); q=q->next; } } void main(){ LinkQueue Q; InitQueue(Q); EnQueue(Q,1); EnQueue(Q,2); EnQueue(Q,3); EnQueue(Q,4); printV(Q); ElemType e; //删除队列 DeQueue(Q,e); printf(" %s ","从队头删除一个元素后"); printV(Q); printf(" length:%d ",QueueLength(Q)); }
运行结果: