循环队列的顺序实现和链式实现 #数据结构(C,C++)
记录一下作者在学习数据结构中的所有数据结构和算法的具体实现
顺带补充相关知识
本系列文章注重的是代码实现!代码实现!代码实现!
这里放一个代码合集(目前正在逐步更新中)
代码合集链接
什么是队列
队列也是一种插入和删除受限的线性表。
只允许在一端插入,另一端删除的受限制的线性表。
由于顺序实现的顺序队列会存在假溢出问题,所以我们更常使用的是循环队列,
循环队列就是将顺序队列从逻辑上变为一个环状数组。
顺序循环队列代码实现
#include<iostream>using namespace std;/*由于顺序实现的顺序队列会存在假溢出问题,所以我们直接实现循环队列在循环队列中,区分队满和队空有多种处理方式。1.牺牲一个存储单元,入队时少用一个队列单元。(最常用,所以实现这一种)队满:(q.rear+1)%N==q.front队空:q.rear==q.front2.结构体中增加一个size字段,用来记录元素个数队满:显然size==N队空:显然size==0*/const int N = 100;//最大容量typedef struct queue {int rear;//队尾int front;//队头int data[N];
}sq;// 初始化队列
void initQueue(sq& q) {q.front = q.rear = 0;
}
// 是否为空
bool isEmpty(sq q) {return q.front == q.rear;
}
// 是否队满
bool isFull(sq q){return (q.rear + 1) % N == q.front;
}
// 入队
bool push(sq& q,int num) {if (isFull(q))return false;q.data[q.rear] = num;q.rear = (q.rear + 1) % N;return true;
}
// 出队
bool pop(sq& q,int& num) {if (isEmpty(q))return false;num = q.data[q.front];q.front = (q.front + 1) % N;return true;
}
// 读队首元素
bool getFront(sq& q,int& num) {if (isEmpty(q))return false;num = q.data[q.front];return true;
}
链队实现
链队相当于一个有头尾节点的单链表
#include<iostream>typedef struct linkNode {int data;struct linkNode* next;
}linkNode;typedef struct {linkNode* front;linkNode* rear;
}linkQueue;bool initQueue(linkQueue& q) {q.front = q.rear = (linkNode*)malloc(sizeof(linkNode));if (q.front == NULL || q.rear == NULL)return false;q.front->next = NULL;return true;
}bool isEmpty(linkQueue q) {if (q.front == q.rear)return true;else return false;
}bool enQueue(linkQueue& q, int x) {linkNode* s = (linkNode*)malloc(sizeof(linkNode));if (s == NULL)return false;s->data = x;s->next = NULL;q.rear->next = s;q.rear = s;return true;
}bool deQueue(linkQueue& q, int& x) {if (isEmpty(q))return false;linkNode* p = q.front->next;x = p->data;q.front->next = p->next;if (q.rear == p)q.rear = q.front;free(p);return true;
}bool getHead(linkQueue q, int& x) {if (isEmpty(q))return false;x = q.front->next->data;return true;
}int main() {return 0;
}
参考
王道数据结构考研复习指导书
严蔚敏数据结构