- /***循环队列基本操作***/
- #include
- #include
- #include
- using namespace std;
- #defineMAXQSIZE 100#defineOK 1#defineERROR 0#defineOVERFLOW -2
- typedef int QElemType;
- typedef int Status;
- typedef struct {
- QElemType *base;//初始化时动态分配存储空间
- intfront;//头指针
- intrear;//尾指针
- } SqQueue;
- //算法3.11循环队列的初始化Status InitQueue(SqQueue &Q)//构造一个空队列Q
- {
- Q.base=newQElemType[MAXQSIZE];//为队列分配一个最大容量为MAXSIZE的数组空间
- if(!Q.base)
- exit(OVERFLOW); //存储分配失败Q.front = Q.rear =0;//头指针和尾指针置为零,队列为空
- return OK;
- }
- bool QueueEmpty(SqQueue Q)
- {
- returnQ.front == Q.rear;
- }
- //算法3.12求循环队列的长度
- intQueueLength(SqQueue Q)//返回Q的元素个数,即队列的长度
- {
- return(Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
- }
- //算法3.13循环队列的入队Status EnQueue(SqQueue &Q, QElemType e)//插入元素e为Q的新的队尾元素
- {
- if((Q.rear +1) % MAXQSIZE == Q.front)//尾指针在循环意义上加1后等于头指针,表明队满
- return ERROR;
- Q.base[Q.rear] = e;//新元素插入队尾Q.rear = (Q.rear +1) % MAXQSIZE;//队尾指针加1
- return OK;
- }
- //算法3.14循环队列的出队Status DeQueue(SqQueue &Q, QElemType &e)//删除Q的队头元素,用e返回其值
- {
- if(Q.front == Q.rear)
- returnERROR;//队空e = Q.base[Q.front];//保存队头元素Q.front = (Q.front +1) % MAXQSIZE;//队头指针加1
- return OK;
- }
- //销毁队列Q,Q不再存在
- voidDestroyQueue(SqQueue &Q)
- {
- if(Q.base)
- delete[]Q.base;
- Q.base= NULL;
- Q.front = Q.rear =0;
- }
- Status dequeue_rear(SqQueue& Q, QElemType &e)
- //Q是如上定义的循环队列,本算法实现从队尾删除,若删除成功,返回被删除元素,否则给出出错信息。
- {
- if(Q.front == Q.rear)
- returnERROR;// 队空Q.rear = (Q.rear -1+ MAXQSIZE) % MAXQSIZE;//修改队尾指针。e = Q.base[Q.rear];//返回出队元素
- return OK;
- }//从队尾删除算法结束
- Status enqueue_front(SqQueue& Q, QElemType x)
- // Q是顺序存储的循环队列,本算法实现"从队头插入"元素x。
- {
- if(Q.rear == (Q.front -1+ MAXQSIZE) % MAXQSIZE)
- returnERROR;// 队满Q.front = (Q.front -1+ MAXQSIZE) % MAXQSIZE;//修改队头指针。Q.base[Q.front] = x;//x 入队列
- return OK;
- }// 结束从队头插入算法。
- int main()
- {
- SqQueue Q;
- QElemType e;
- InitQueue(Q);
- enqueue_front(Q, 3);//队列3enqueue_front(Q,4);//队列4 3enqueue_front(Q,5);//队列5 4 3DeQueue(Q, e);//队列 4 3cout << e << endl;//5DeQueue(Q, e);//队列 3cout << e << endl;//4enqueue_front(Q,2);//队列 2 3enqueue_front(Q,1);//队列 1 2 3dequeue_rear(Q,e);//队列 1 2cout << e << endl;//3dequeue_rear(Q,e);//队列1cout << e << endl;//2
- return 0;
- }
来源: http://www.bubuko.com/infodetail-2050759.html