顺序队列是一段连续的地址,但是存在假溢出情况,所以要用循环队列来实现,具体操作像钟表
下面是顺序队列的表示与实现:
#include <iostream> using namespace std; //顺序循环队列的基本表示和实现 const int MAX_SIZE = 100;//定义队列长度 struct SqQueue { int * base; int front ; int rear; }; //初始化队列 注意队尾队首指针的初始化 bool InitQueue(SqQueue &sq) { sq.base=(int*)malloc(sizeof(int)); if (!sq.base) { return false; } sq.front=sq.rear=0; cout<<"Initial Queue Successfully!"<<endl; return true; } //返回队列的长度 int QueueLength(SqQueue &sq) { return (sq.rear-sq.front+MAX_SIZE)%(MAX_SIZE); } //插入元素e为 队列的队尾元素 bool EnQueue(SqQueue &sq,int e) { if ((sq.rear+1)%(MAX_SIZE)==sq.front)//循环队列 判断队列是否满了 { cout<<"sorry ,overflow"<<endl; return false; } sq.base[sq.rear]=e; sq.rear=(sq.rear+1)%MAX_SIZE;//如果钟表走到12点 下一个将走到1点 return true; } //删除队首元素 用e返回 bool DeQueue(SqQueue &sq,int &e) { if (sq.front==sq.rear)//判断队列是否为空 { cout<<"Sorry,the queue is empty"<<endl; return false; } e=sq.base[sq.front]; sq.front=(sq.front+1)%MAX_SIZE; return true; } //打印队列 void PrintQueue(const SqQueue sq) { if (sq.rear==sq.front) { cout<<"Sorry,the queue is empty"<<endl; return; } cout<<"Now print the new queue:"<<endl; int index=0; index=sq.front; while (index!=sq.rear) { cout<<sq.base[index]<<endl; index=(index+1)%MAX_SIZE; } } void main() { SqQueue sq={0}; InitQueue(sq); int ElemNum=0; cout<<"请输入要插入元素的个数:"; cin>>ElemNum; int Elem=0; for (int i=0;i<ElemNum;i++) { cout<<"请输入要插入第 "<<i+1<<" 个元素:"; cin>>Elem; if (EnQueue(sq,Elem)) { cout<<"插入成功"<<endl;; } } PrintQueue(sq);//打印队列 int delnum; DeQueue(sq,delnum);//删除第一个元素 cout<<"the delete num is :"<<delnum<<endl; PrintQueue(sq);//打印队列 DeQueue(sq,delnum); DeQueue(sq,delnum); PrintQueue(sq);//打印队列 }
结果如下图所示: