目录
循环队列
原则:先进先出
1、为了解决假溢出问题,将顺序队列变成一个环状的空间,称为循环队列
2、头尾指针以及队列元素之间的关系不变,只是再循环队列中,头尾指针以环状增1的操作可以用模运算来实现。通过取模,头尾指针可以在顺序表空间内以头尾衔接的方式循环移动。
3、当队列空间均被占满,此时头尾指针相同;
而当队列为空时,头尾指针也是相同的;
所以循环队列不能以头尾指针是否相同判别队列是满还是空
通常处理方式:
少用一个空间,即当队列空间大小m时,有m-1个元素就认为是队满。这样判断队空条件不变,当头尾指针的值相同时,则认为对空;而当尾指针在循环意义上加1等于头指针时,认为队满
队空条件:q.front==q.rear
队满条件:(q.rear+1)%MAXSIZE==q.front
1、存储结构
#include<bits/stdc++.h> using namespace std; #define MAXSIZE 110 //顺序栈存储空间的初始分配量 #define OK 1 //成功标识 #define ERROR 0 //失败标识 typedef int Status; //Status是函数的类型,其值是函数结果状态代码,如OK等 typedef struct { int *base;//存储空间的基地址 int front;//头指针 int rear;//尾指针 }Sqqueue;
2、初始化
//初始化 Status init(Sqqueue &q) { q.base =new int[MAXSIZE];//为顺序栈分配空间 if(!q.base ) exit(0);//存储失败 q.front =q.rear =0;//将头指针和尾指针置0,队列为空 return OK; }
3、求队列长度
//球队列长度 int len(Sqqueue q) { return (q.rear -q.front +MAXSIZE)%MAXSIZE; }
4、入队
//入队 Status Push(Sqqueue &q,int e) { if((q.rear+1 )%MAXSIZE==q.front )//队满 return ERROR; q.base [q.rear ]=e;//新元素插入队尾 q.rear =(q.rear +1)%MAXSIZE;//队尾指针加1 return OK; }
5、出队
//出队 Status Pop(Sqqueue &q,int &e) { if(q.front ==q.rear )//队空 return ERROR; e=q.base [q.front ] ;//保存对头元素 q.front =(q.front +1)%MAXSIZE;//对头指针加一 return OK; }
6.取队头元素
//取对头元素 int Get(Sqqueue q) { if(q.front !=q.rear )//队列非空 return q.base [q.front ];//返回 }
7、输出队列中元素
Status Put(Sqqueue q) { cout<<"队列中元素:"; int i=0; while(q.front+i !=q.rear )//队列非空 { cout<<q.base [q.front+i ]<<' '; i++; } cout<<endl; return OK; }
8、主函数
int main() { Sqqueue q; init(q); int n,k,e[100]; cout<<"请输入你要入队元素个数:"; cin>>n; cout<<"请输入你要入队元素:"; for(int i=0;i<n;i++) { cin>>e[i]; Push(q,e[i]); } Put(q); cout<<"对头元素:"; Pop(q,k); Put(q); return 0; }