懒癌患者

循环队列的基本操作实现
1.构造循环队列原因:队列初始化时,令front=rear=0,每当插入一个元素时,“尾指针加1”;
删除一个元素时,“头指针加1”(注意指针都是加一)。
因此,在非空队列中,头指针始终指向队列的头元素,二尾指针始终指向队列的尾元素。
当删除一定量的元素后,队首则放空,而队尾若到达了边界值,则无法继续入队,这种情况下,造成了空间的浪费。
所以一个巧妙的方法就是,构造一个循环队列,充分利用空间。
2.循环队列判空、满的解决:
由于队列的判空或满的情况冲突,因此采用以下两种方法来解决这种问题:
(1)另外设置一个标志位以区别队列是“空”还是“满”;
(2)少用一个元素空间,约定“当队列头指针在队列尾指针的下一位(指环状的下一个位置)”上作为队列满“满”的标志。
即当队列是空的时候 满足条件Q.front==Q.rear;当队列满的时候满足条件(Q.rear+1)%MAXSIZE == Q.front。MAXSIZE指
代队列的最大长度。
3.队列当前长度的获取:(Q.rear-Q.front+MAXSIZE)%MAXSIZE
4.循环基本操作队列实现(C语言)
#include<iostream>
#include<cstdlib>
using namespace std;
#define MaxLength 100
typedef int Elemtype;
typedef struct {
Elemtype *base;//初始化的动态分配存储空间
int front;//头指针,若队列不空,则指向队列的头元素
int rear;//尾指针,若队列不空,指向队尾元素的下一个位置
}SqQueue;
/*循环队列基本操作的实现*/
//1.初始化,构造一个空队列
int init(SqQueue &Q){
Q.base = (Elemtype *)malloc(MaxLength*sizeof(Elemtype));//申请内存空间,其类型为Elemtype
if(!Q.base) exit(0);
Q.front = Q.rear = 0; //初始化
return 1;
}
//2.求循环队列的长度
int length(SqQueue &Q){
return (Q.rear-Q.front + MaxLength)%MaxLength;
}
//3.插入一个元素
int insertRear(SqQueue &Q,Elemtype e){
if((Q.rear+1)%MaxLength == MaxLength){
cout<<"队列已满";
return 0;
}
Q.base[Q.rear] = e;
Q.rear = (Q.rear+1)%MaxLength;//队尾指针进1
return 1;
}
//4、删除一个元素
int deleteFront(SqQueue &Q,Elemtype &e){
if(Q.front == Q.rear){
cout<<"队列为空"<<endl;
return 0;
}
e = Q.base[Q.front]; //选取队首元素,用e返回其地址
cout<<e<<" ";
Q.front=(Q.front+1)%MaxLength;
return 1;
}
int main(){
SqQueue Q;
init(Q);
int i,n;
Elemtype e;
cout<<"请输入队列的元素(小于0则结束):"<<endl;
while(1){
cin>>e;
if(e<0)break;
cout<<"输入下一个元素:"<<endl;
insertRear(Q,e);
}
int len = length(Q);
cout<<"删除所有元素(列出队列的所有元素)"<<endl;
for(int i=0;i<len;i++){
deleteFront(Q,e);
}
//在执行一次删除,出现异常
deleteFront(Q,e);
return 0;
}