循环队列

#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;
原文地址:https://www.cnblogs.com/smallbrokenchildwen/p/6810022.html