循环队列基本操作C++

#include <iostream>
#include <stdlib.h>
using namespace std;
typedef int QElemType;
#define MAXQSIZE 100
#define OVERFLOW -2
//#define true 1
//#define false -1

//循环队列定义
typedef struct {
	QElemType *base; // 存储空间基址
	int rear; // 队尾指针
	int front; // 队头指针
	int queuesize; // 允许的最大存储空间
} SqQueue;
//初始化长度为 MAXQSIZE 的空队列
bool InitQueue(SqQueue &Q,int b)
{
	//用 malloc 申请一块内存,大小是 MAXQSIZE*sizeof(ElemType)。
	 //将此函数返回的内存地址强制转换成 QElemtype 类型的指针,即 QElemType*
	Q.base = (QElemType*)malloc(b * sizeof(QElemType));//(QElemType*)强制转换成该类型

		if (!Q.base)exit(OVERFLOW);//存储分配失败
	Q.front = Q.rear = 0;//队列为空
	return true;

}
//新元素 e 入队列,成功返回 true,失败返回 false 
bool EnQueue(SqQueue &Q, QElemType e)
{
	if ((Q.rear + 1) % MAXQSIZE == Q.front)return false;//if判断的条件是队列是否满了
	Q.base[Q.rear] = e;//从队尾入 循环队列是数组
	Q.rear = (Q.rear + 1) % MAXQSIZE;//队尾指针移动 模运算
	return true;
}
//出队列,即删除队首元素,并用 e 返回出元素值 ,成功返回 true,失败返回 false 
bool DeQueue(SqQueue &Q, QElemType &e)
{
	if (Q.front == Q.rear)return false;//先判断是不是为空队列
	e = Q.base[Q.front];//用e保存要出队的元素 因为从队头出 所以是Q.front
	Q.front = (Q.front + 1) % MAXQSIZE;//用模运算的方法改变指针 循环队列的关键
	cout << e;
	return true;

}
//读队首元素,用 e 返回队首元素,不出队 ,成功返回 true,失败返回 false 
bool GetHead(SqQueue Q, QElemType &e)
{
	if ((Q.rear + 1) % MAXQSIZE == Q.front)return false;
	e = Q.base[Q.front];
	cout << e;
	return true;

}
//遍历队列
void Traverse(SqQueue Q)
{

	while (Q.front != Q.rear) {



		cout << Q.base[Q.front] << " ";
		Q.front = (Q.front + 1) % MAXQSIZE;//改变指针的方法跟普通队列不一样

	}
}
//销毁循环队列
void Destroy(SqQueue Q)
{
	while (Q.front != Q.rear)//头指针不等于尾指针时
	{
		free(&Q.base[Q.front]);//释放地址 因为要销毁
		Q.front = (Q.front + 1) % MAXQSIZE;//移动头指针
	}
}
//求队列的长度
int QueueLength(SqQueue Q) {

	return(Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;


}
int main(void)
{
	SqQueue Sque;
	int c = 0;
	QElemType e;
	while (c != 7)
	{
		cout << endl << "1. 初始化循环队列";
		cout << endl << "2. 入队";
		cout << endl << "3. 出队";
		cout << endl << "4. 读队首";
		cout << endl << "5. 遍历队列";
		cout << endl << "6. 销毁循环队列";
		cout << endl << "7. 退出";
		cout << endl << "选择功能(1~7):";
		cin >> c;
		switch (c)
		{
		case 1:
		{
			InitQueue(Sque, MAXQSIZE);
			cout << "初始化成功";
			break;
		}
		case 2:
		{
			cout << "请输入要入队的元素";
			cin >> e;
			EnQueue(Sque, e);
			cout << "入队成功";
			break;
		}
		case 3:
		{
			DeQueue(Sque, e);
			break;
		}
		case 4:
		{
			GetHead(Sque, e);
			break;
		}
		case 5:
		{
			Traverse(Sque);
			break;
		}
		case 6:
		{
			Destroy(Sque);
			cout << "销毁成功";
			break;
		}
		case 7:
		{
			break;
		}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值