顺序循环队列

156 阅读1分钟
#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;

#define MAXQSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//循环队列的顺序存储结构
typedef struct {
	char *data;//初始化时动态分配存储空间
	int front;//头指针
	int rear;//尾指针
} SqQueue;

//循环队列的初始化
int InitQueue(SqQueue &Q) {
	Q.data = new char[MAXQSIZE]; //为队列分配一个最大容量为MAXSIZE的数组空间
	if (!Q.data)
		exit(OVERFLOW);
	Q.front = Q.rear = 0; //头指针和尾指针置为零,队列为空
	return OK;
}

//循环队列判空
bool IsEmpty(SqQueue Q){
    if(Q.front==Q.rear)
        return true;
    else
        return false;
}

//求循环队列的长度
int QueueLength(SqQueue Q) {//返回Q的元素个数,即队列的长度
	return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}

//循环队列的入队
int EnQueue(SqQueue &Q, char e) {//插入元素e为Q的新的队尾元素
	if ((Q.rear + 1) % MAXQSIZE == Q.front) //尾指针在循环意义上加1后等于头指针,表明队满
		return ERROR;
	Q.data[Q.rear] = e; //新元素插入队尾
	Q.rear = (Q.rear + 1) % MAXQSIZE; //队尾指针加1
	return OK;
}

//循环队列的出队
int DeQueue(SqQueue &Q, char &e) {//删除Q的队头元素,用e返回其值
	if (Q.front == Q.rear)
		return ERROR; //队空
	e = Q.data[Q.front]; //保存队头元素
	Q.front = (Q.front + 1) % MAXQSIZE; //队头指针加1
	return OK;
}

//取循环队列的队头元素
char GetHead(SqQueue Q) {//返回Q的队头元素,不修改队头指针
	if (Q.front != Q.rear) //队列非空
		return Q.data[Q.front]; //返回队头元素的值,队头指针不变
}
//循环队列的遍历
void TraverseQueue(SqQueue Q){
    while (Q.front != Q.rear) {
        cout<<Q.data[Q.front];
        Q.front++;
    }
}


int main()
{
    freopen("input.txt", "r", stdin);
    SqQueue Q;
    int n;char e;

    InitQueue(Q);

    cout<<"输入队列的长度:"<<endl;
    cin>>n;
    cout<<"输入队列的元素:"<<endl;
    for (int i = 1; i <= n; i++){
        cin>>e;
        EnQueue(Q, e);
    }

    cout<<"现在队首元素是:";
    cout<<GetHead(Q)<<endl;


    cout<<"队列长度为:"<<QueueLength(Q)<<endl;


    cout<<endl<<"请输入要插入的元素的数值:";
    cin>>e;
    EnQueue(Q,e);


    cout<<endl<<"遍历队列结果为:";
    TraverseQueue(Q);
    cout<<endl;




    cout << "依次弹出的队头元素为:\n";
    while (DeQueue(Q, e)) {
        int flag = -1;
        cout << e << "  ";
    }


    cout<<endl;


    if (IsEmpty(Q))
        cout<<"队列为空"<<endl;
    else
        cout<<"队列非空"<<endl;


    return 0;

}