#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
#define MaxSize 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char Stype;
typedef struct{
char *base;
int front;//头指针
int rear;//尾指针
}SqQueue;
//循环队列的初始化
int InitQueue(SqQueue &q){//构造一个空队列q
q.base=new char[MaxSize];//为队列分配空间
if(!q.base)
exit(OVERFLOW);//存储分配失败 退出
q.front=q.rear=0;//头指针和尾指针置为0 队列为空
return OK;
}
// 求循环队列的长度
int QueueLength(SqQueue q){
return (q.rear-q.front+MaxSize)%MaxSize;
}
//循环队列的入队
int EnQueue(SqQueue &q,char e){
if((q.rear+1)%MaxSize==q.front)
return ERROR;
q.base[q.rear]=e;//新元素插入队尾
q.rear=(q.rear+1)%MaxSize;//尾指针加1
return OK;
}
//循环队列的出队
int DeQueue(SqQueue &q ,char &e){
if(q.front==q.rear)
return ERROR;//队列为空 返回
e=q.base[q.front];//取队首数据
q.front=(q.front+1)%MaxSize;//头指针数据加1 表示头数据向后移了一位
return OK;
}
//取循环队列的头元素
Stype GetHead(SqQueue q){
if(q.front!=q.rear)//队列不为空
return q.base[q.front];
}
int main(){
int choose,flag=0;
SqQueue Q;
char e,j;
cout << " 1.初始化
";
cout << " 2.入队
";
cout << " 3.读队头元素
";
cout << " 4.出队
";
cout << " 0.退出
";
choose = -1;
while (choose != 0) {
cout << " 请选择: ";
cin >> choose;
switch (choose) {
case 1://算法3.16 链队的初始化
if (InitQueue(Q)) {
flag = 1;
cout << " 成功对队列进行初始化
";
} else
cout << " 初始化队列失败
";
break;
case 2: {//算法3.17 链队的入队
fstream file;
file.open("QNode.txt");
if (!file) {
cout << " 错误!未找到文件!
" << endl;
exit(ERROR);
}
if (flag) {
flag = 1;
cout << " 入队的元素依次为:
";
while (!file.eof()) {
file >> j;
if (file.fail())
break;
else {
EnQueue(Q, j);
cout << j << " ";
}
}
cout << endl << endl;
} else
cout << " 队列未建立,请重新选择
";
file.close();
}
break;
case 3://算法3.19 取链队的队头元素
if (flag != -1 && flag != 0)
cout << " 队头元素为:
" << GetHead(Q) << endl << endl;
else
cout << " 队列中无元素,请重新选择
" << endl;
break;
case 4://算法3.18 链队的出队
cout << " 依次弹出的队头元素为:
";
while (DeQueue(Q, e)) {
flag = -1;
cout << e << " ";
}
cout << endl << endl;
break;
}
}
return 0;
}
循环队列秉承先进先出的原则,定义了 *base 存储数据的指针 front 指向队列的第一个元素 rear 指向队列的最后一个元素 插入一条数据 rear+1;