C循环队列

21 篇文章 0 订阅

循环队列实现

#include <iostream>
#include <Windows.h>
#include <iomanip>

#define MasSize 10	//顺序表最大存储的个数

using namespace std;
typedef int DataType;	//顺序表的数据类型

typedef struct Queue {
	DataType queuq[MasSize];
	int front;	//假设为对头指针
	int rear;	//假设为对尾指针
}SeqQueue;

void InitQueue(SeqQueue* SQ) {	//初始化队列
	if (!SQ) { return; }

	SQ->front = 0;
	SQ->rear = 0;
}

bool IsEmpty(SeqQueue* SQ) {	//判断对列是否为空
	if (!SQ) { return false; }
	if (SQ->front == SQ->rear) { cout << "队列为空" << endl; return true; }

	return false;
}

bool IsFull(SeqQueue* SQ) {	//判断队列是否为满
	if (!SQ) { return false; }
	if ((SQ->rear + 1) % MasSize == SQ->front) { cout << "队列已满!" << endl; return true; }

	return false;
}

bool EnterQueue(SeqQueue* SQ, DataType data) {	//入队	
	if (!SQ) { return false; }

	if (IsFull(SQ)) { cout << "队列已满!" << endl; return false; }

	SQ->queuq[SQ->rear] = data;   //在队尾插入元素 data
	SQ->rear = (SQ->rear + 1) % MasSize; //队尾指针后移一位

	return true;
}

bool Delete(SeqQueue* SQ, DataType* data) { //出队
	if (!SQ) { return false; }
	if (IsEmpty(SQ)) { cout << "队列为空!" << endl; return false; }
	if (!data) { return false; }

	*data = SQ->queuq[SQ->front];
	SQ->front = (SQ->front + 1) % MasSize;

	return true;
}

int GetHead(SeqQueue* SQ, DataType* data) {	//获取队首元素
	if (!SQ || IsEmpty(SQ)) { cout << "队列为空!" << endl; return false; }

	return *data = SQ->queuq[SQ->front];
}

void Clear(SeqQueue* SQ) {	//清空列表
	SQ->front = SQ->rear = 0;
}

void print(SeqQueue* SQ) {
	if (!SQ) { return; }

	cout << "队列中的所有数据" << endl;

	for (int i = SQ->front; i != SQ->rear; i = (i + 1) % MasSize) {
		cout << setw(4) << SQ->queuq[i];
	}
	cout << endl;
}

int getLength(SeqQueue* SQ) {
	if (!SQ || IsEmpty(SQ)) { cout << "队列为空!" << endl; return false; }
	int j = NULL;

	j = (SQ->rear - SQ->front + MasSize) % MasSize;

	return j;
}


int main(void) {
	SeqQueue* SQ = new SeqQueue;
	DataType data = -1;

	InitQueue(SQ);	//队列初始化

	for (int i = 0; i < 9; i++) {	//入队
		EnterQueue(SQ, i);
	}

	print(SQ);	//打印
	cout << "队列中的总元素:" << getLength(SQ) << "个" << endl;

	while (SQ->rear != SQ->front) {
		if (Delete(SQ, &data)) {
			cout << data << "出队成功!" << endl;
		}
		else {
			cout << "出队失败!" << endl;
		}
	}
	
	cout << endl;
	cout << "第二次入队" << endl;
	for (int i = 0; i < 9; i++) {	//入队
		EnterQueue(SQ, i+10);
	}

	print(SQ);	//打印
	cout << "队列中的总元素:" << getLength(SQ) << "个" << endl;

	cout << "第二次出队" << endl;
	while (SQ->rear != SQ->front) {
		if (Delete(SQ, &data)) {
			cout << data << "出队成功!" << endl;
		}
		else {
			cout << "出队失败!" << endl;
		}
	}

	delete SQ;
	system("pause");
	return NULL;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值