数据结构之循环队列

来源:互联网 发布:如果女朋友是病娇 知乎 编辑:程序博客网 时间:2024/05/22 16:59

针对顺序队列在出队时需要移动大量元素,或者是浪费空间等问题,实现了基本的循环队列。当然这里实现的循环队列也存在缺陷,就是需要提前定义好大小。

#include <iostream>using namespace std;#define MAXSIZE 5typedef int DataType;struct SqQueueCy{DataType* base;int front;int rear;};//队列的初始化bool SqQueueCyInit(SqQueueCy& Q){Q.base = (DataType*)malloc(MAXSIZE * sizeof(DataType));if (!Q.base){cout << "malloc init error" << endl;return false;}Q.front = Q.rear = 0;return true;}//队列销毁bool SqQueueCyDestroy(SqQueueCy& Q){free(Q.base);Q.base = NULL;Q.front = Q.rear = 0;return true;}//队列清空bool SqQueueCyClear(SqQueueCy& Q){Q.front = Q.rear = 0;return true;}//队列是否为空bool SqQueueCyEmpty(SqQueueCy Q){if (Q.rear == Q.front)return true;elsereturn false;}//队列的长度int SqQueueCyLength(SqQueueCy Q){return ((Q.rear - Q.front + MAXSIZE) % MAXSIZE);}//获取队列队头bool SqQueueCyGetHead(SqQueueCy Q,DataType& e){if (Q.front == Q.rear)return false;e = Q.base[Q.front];return true;}//入队bool SqQueueCyInsert(SqQueueCy& Q, DataType e){//为了区分队满和队空if ((Q.rear + 1) % MAXSIZE == Q.front)return false;Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) % MAXSIZE;//因为队列是循环的,所以要取余,不然会溢出;return true;}//出队bool SqQueueCyDelete(SqQueueCy& Q, DataType& e){if (Q.front == Q.rear)return false;e = Q.base[Q.front];Q.front = (Q.front + 1) % MAXSIZE; //因为队列是循环的,所以要取余,不然会溢出;}void SqQueueCyTraverse(SqQueueCy Q,void(*visit)(DataType)){while (Q.front < Q.rear){visit(Q.base[Q.front]);Q.front++;}cout << endl;}void visit(DataType c){cout << " " << c;}void main(){DataType e0;SqQueueCy Q;SqQueueCyInit(Q);cout << "向队列中插入元素为:";for (int i = 1; i <= 5; i++){SqQueueCyInsert(Q, i);}SqQueueCyTraverse(Q, visit);cout << "此时队列的长度为:" << SqQueueCyLength(Q) << endl;SqQueueCyGetHead(Q, e0);cout << "队列的队头为:" << e0 << endl;SqQueueCyDelete(Q, e0);cout << "队头出队后,队列的长度为:" << SqQueueCyLength(Q) << endl;cout << "队头出队后,队列元素为:";SqQueueCyTraverse(Q, visit);SqQueueCyClear(Q);cout << "清空队列后,队列的长度为:" << SqQueueCyLength(Q) << endl;system("pause");}












原创粉丝点击