复习之后才知道
循环队列完全是臆想出来的……其实还是一维数组
并且严老师始终坚持着 末尾指针指向队列元素的下一个,先放元素再让指针++
所以造成了空满判断条件一样的情况
解决方法有3:
1.设置标志位flage以区别队列空还是满
2.少用一个元素空间,即尾指针指向的位置没有元素,但是下一个是头指针时,我们则认为是满的
这里用MAXQSIZE取模原因:因为是臆想的嘛其实他还是个一位数组,假如最大容量100尾指针指向S[99],头指针指向[0],加1其实指针出去了,但是我们假想成指向头指针
3.设置数字计数器
这里队长用到了MAXQSIZE
(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE,还是因为我们模拟循环队列的原因
假如rear指向[3],front 指向S[5] 总长是10,我们知道计算应该是(9-5)+1+3
假如front 指向S[2] ,rear指向[5]总长是10,计算应该是4-2+1,也可以是【(9-2)+1+5】%10
……数学问题记住就好
#include <iostream>
using namespace std;
#define MAXQSIZE 100
typedef int QElemType;
typedef struct{
QElemType *base;
int front;
int rear;
}SqQueue;
bool InitQueue(SqQueue &Q){
Q.base=new int[MAXQSIZE];
Q.front=Q.rear=0;
return true;
}
bool QueueEmpty(SqQueue Q){
if(Q.front==Q.rear) return true;
else return false;
}
int QueueLength(SqQueue Q){
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
bool Enqueue(SqQueue &Q,QElemType e){
if((Q.rear+1)%MAXQSIZE==Q.front)return false;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return true;
}
bool DeQueue(SqQueue &Q,QElemType &e){
if(QueueEmpty(Q))return false;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return true;
}
void Print(SqQueue Q)
{
cout << "队列元素为";
if (QueueEmpty(Q))
{
cout << "队列为空" << endl;
return;
}
int ptr = Q.front;
while (ptr != Q.rear)
{
cout << Q.base[ptr] << ' ';
ptr++;
}
}
int main() {
SqQueue q;
InitQueue(q);
int val;
cout << "请输入队列元素";
while (cin >> val)
Enqueue(q,val);
Print(q);
int val2;
DeQueue(q,val2);
cout<<"被删除元素为:"<<val2;
Print(q);
system("pause");
return 0;
}