三,队列
队列(操作受限制的线性表):先进先出,一端插入,另一端输出
队列的顺序存储实现:数组+对头变量+队尾变量
typedef struct { int Data[MAXSIZE]; int rear; // rear指向的是真实的数组排序个数,是实际个数-1,front指向第一个数之前的位置 int front; //队尾变量rear和对头变量front最初都是指向-1 }Queue;
如果是正常的线状队列,前面删除数据部分的空间无法使用,会造成浪费;所有出现循环队列
循环队列会出现的问题:空满时front==rear都是相等,无法区分
原因:n种长度值对应n+1种情况
解决方法:使用额外标记:size或者tag;仅仅使用n-1的数组空间
void AddQ(Queue *PtrQ, int item) {//front 和rear 指针的移动采用“加1取余”法,体现了“循环使用” if ((PtrQ->rear + 1) % MAXSIZE == PtrQ->front) { printf("队列满"); return; } PtrQ->rear = (PtrQ->rear + 1) % MAXSIZE;//在队列的尾部插入元素 PtrQ->Data[PtrQ->rear] = item; } int DeleteQ(Queue *PtrQ) { if (PtrQ->front == PtrQ->rear) { printf("队列空"); return -NAN; } else {//此处在之前使front加1的原因是front原本指向的是第一个数之前的位置 PtrQ->front = (PtrQ->front + 1) % MAXSIZE; return PtrQ->Data[PtrQ->front]; } }
队列的链式存储实现:单链表的实现
typedef struct { LinkStack *rear; //指向队尾结点; LinkStack *front; //指向对头结点; }LinkQueue;
int DeleteQ(LinkQueue *PtrQ) { LinkStack *First = new LinkStack; int result; if (PtrQ->front = NULL) { printf("队列空"); return -NAN; } First = PtrQ->front; if (PtrQ->front == PtrQ->rear) PtrQ->front = PtrQ->rear = NULL; else { PtrQ->front = PtrQ->front->Next; } result = First->Data; delete(First); return result; }