循环队列的顺序实现和链式实现 #数据结构(C,C++)

记录一下作者在学习数据结构中的所有数据结构和算法的具体实现
顺带补充相关知识
本系列文章注重的是代码实现!代码实现!代码实现!

这里放一个代码合集(目前正在逐步更新中)
代码合集链接

什么是队列

队列也是一种插入和删除受限的线性表。
只允许在一端插入,另一端删除的受限制的线性表。

由于顺序实现的顺序队列会存在假溢出问题,所以我们更常使用的是循环队列,
循环队列就是将顺序队列从逻辑上变为一个环状数组。

顺序循环队列代码实现

#include

using namespace std;

/*
	由于顺序实现的顺序队列会存在假溢出问题,所以我们直接实现循环队列

	在循环队列中,区分队满和队空有多种处理方式。
	1.牺牲一个存储单元,入队时少用一个队列单元。(最常用,所以实现这一种)
	队满:(q.rear+1)%N==q.front
	队空:q.rear==q.front
	
	2.结构体中增加一个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

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;
}

参考

王道数据结构考研复习指导书
严蔚敏数据结构

你可能感兴趣的:(数据结构,数据结构,c语言,c++)