笔记:
设置一个表示元素个数的数据成员tag标记最近一次插入或删除操作,初始化tag为0
头指针指向队头元素,尾指针指向队尾元素的下一个位置
队空条件:(Q.front==Q.rear)&&(Q.tag==0)
队满条件:(Q.front==Q.rear)&&(Q.tag=1)
队中元素个数:(Q.rear-Q.front+MaxSize-1)%MaxSize+1
(这里值得注意,因为如果括号内不减1则队满时元素个数结果为0)
代码如下:
#include <iostream> //设置一个表示元素个数的数据成员tag标记最近一次插入或删除操作 //头指针指向队头元素,尾指针指向队尾元素的下一个位置 typedef int ElemType; using namespace std; //循环队列结构类型 #define MaxSize 10 typedef struct { ElemType data[MaxSize]; int rear,front; int tag; } SqQeueu; //初始化 void InitQueue(SqQeueu &Q) { Q.front=0; Q.rear=0; Q.tag=0; } //判断队空 bool QueueEmpty(SqQeueu Q) { if((Q.front==Q.rear)&&(Q.tag==0))//判断队空 { cout<<"队空!"<<endl; return true; } else return false; } //入队 bool EnQueue(SqQeueu &Q, ElemType x) { if((Q.front==Q.rear)&&(Q.tag==1))//判断队满 { cout<<"队满!无法再插入!"<<endl; return false;//队满则无法插入 } Q.data[Q.rear]=x;//先放元素 Q.rear=(Q.rear+1)%MaxSize;//再改变指针指向 Q.tag=1;//标记插入操作 return true; } //出队 bool DeQueue(SqQeueu &Q, ElemType &x) { if((Q.front==Q.rear)&&(Q.tag==0))//判断队空 return false;//队空则无法删除 x=Q.data[Q.front];//先取元素 Q.front=(Q.front+1)%MaxSize;//再改变指针指向 Q.tag=0;//标记删除操作 return true; } //读取队头 bool GetHead(SqQeueu Q, ElemType &x) { if((Q.front==Q.rear)&&(Q.tag==0))//判断队空 return false; x=Q.data[Q.front];//取元素 cout<<"队头元素为:"<<x<<endl; return true; } //求队中元素的个数 void GetNumber(SqQeueu Q, int &y) { y=(Q.rear-Q.front+MaxSize-1)%MaxSize+1; cout<<"队中元素个数为:"<<y<<endl; } //打印输出队列 void PrintQueue(SqQeueu Q) { if((Q.front==Q.rear)&&(Q.tag==0))//判断队空 return; cout<<"队中元素为:"; do { cout<<Q.data[Q.front]<<" "; Q.front=(Q.front+1)%MaxSize; }while(Q.front!=Q.rear); cout<<endl; } int main() { int x; int y=0;//用y来记录队列中元素的个数 SqQeueu Q;//声明一个队列 InitQueue(Q);//初始化一个队列 QueueEmpty(Q);//判断队空 GetNumber(Q,y);//获取队列中元素的个数 cout<<"元素入队......"<<endl; EnQueue(Q,1); EnQueue(Q,2); EnQueue(Q,3); EnQueue(Q,4); EnQueue(Q,5); EnQueue(Q,6); EnQueue(Q,7); EnQueue(Q,8); EnQueue(Q,9); EnQueue(Q,10); GetHead(Q,x); GetNumber(Q,y); PrintQueue(Q); cout<<"元素出队......"<<endl; DeQueue(Q,x); DeQueue(Q,x); GetHead(Q,x); GetNumber(Q,y); PrintQueue(Q); cout<<"元素入队......"<<endl; EnQueue(Q,11); EnQueue(Q,12); GetHead(Q,x); GetNumber(Q,y); PrintQueue(Q); return 0; }