#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;
}
}
}
}
循环队列基本操作C++
最新推荐文章于 2022-11-23 10:06:20 发布