C++学习---队列的构建及操作
一、循环队列
#include <iostream> using namespace std; #define MAXQSIZE 100 typedef struct { int* base;//存储空间的基地址 int front;//头指针 int rear;//尾指针 }SqQueue; //初始化队列 构造一个空队列Q void InitQueue(SqQueue& Q) { Q.base = new int[MAXQSIZE];//为队列分配一个最大容量为MAXQSIZE的数组空间 if (!Q.base) exit(OVERFLOW);//存储分配失败 Q.front = Q.rear = 0;//将0赋值给头指针和尾指针,表示队列为空 } //入队,e为插入的元素 bool EnQueue(SqQueue& Q, int e) { if ((Q.rear + 1) % MAXQSIZE == Q.front) return false;//尾指针在循环意义上加1后等于头指针,表示队满 Q.base[Q.rear] = e;//e插入队尾 Q.rear = (Q.rear + 1) % MAXQSIZE;//队尾指针加1.如果超过100则从0重新计数 return true; } //出队,删除队列Q的队头元素,用e返回其值 bool DeQueue(SqQueue& Q, int &e) { if (Q.front == Q.rear) return false;//队空 e = Q.base[Q.front];//将队头元素赋值给e Q.front = (Q.front + 1) % MAXQSIZE;//队头指针加一 return true; } //取队头元素 int GetHead(SqQueue Q) { //当队列不为空时,返回队列头元素 if (Q.front != Q.rear) return Q.base[Q.front]; return NULL; } //返回队列Q的元素个数 int QueueLength(SqQueue Q) { return(Q.rear - Q.front + MAXQSIZE) % MAXQSIZE; } //批量入队(这里默认不会超过最大元素数MAXQSIZE) void QueueInput(SqQueue& Q) { int value;//用户输入的值 int n = 0;//输入数据的个数 cout << "你想要输入几个数据?" << endl; cin >> n; for (int i = 0; i < n; i++) { cout << "请输入第" << i + 1 << "个数据:"; cin >> value;//输入元素值 if(EnQueue(Q,value)) cout << "入队成功!" << endl; else cout << "入队失败!"; } } //依次出队 void QueueOut(SqQueue& Q) { int value; cout << "依次出队的值为:\n"; while (DeQueue(Q, value)) cout << value<<"\t"; } int main() { int opearateNum = 0;//操作值 SqQueue Q; InitQueue(Q); while (true) { cout << "1、批量入队\t2、全部依次出队\t3、取队头元素值\t4、出队\t5、队列元素个数\t6、退出" << endl; cin >> opearateNum; if (opearateNum == 6) break; switch (opearateNum) { case 1: //数据输入 QueueInput(Q); system("pause"); system("cls"); break; case 2: //依次出队 QueueOut(Q); system("pause"); system("cls"); break; case 3: if (Q.rear == Q.front) cout << "队列无元素" << endl; else cout << "队头元素值为:" << GetHead(Q) << endl; system("pause"); system("cls"); break; case 4: int value;//出队的值 cout << "出队的元素值为:"; if (!DeQueue(Q,value)) cout << "队列无元素!" << endl; else cout << value << endl; system("pause"); system("cls"); break; case 5: cout << "队列共有" << QueueLength(Q) << "个元素" << endl; system("pause"); system("cls"); break; default: cout << "无效操作,请重新输入!" << endl; break; } } }
二、链队
#include <iostream> using namespace std; typedef struct QNode { int data; struct QNode* next; }*QueuePtr; typedef struct { QueuePtr front;//队头指针 QueuePtr rear;//队尾指针 }LinkQueue; //初始化队列 构造空的队列 void InitQueue(LinkQueue& Q) { Q.front = Q.rear = new QNode;//生成新结点作为头结点,队头和队尾指针指向此结点 Q.front->next = NULL;//头结点的指针域置空 } //入队 插入元素e为队列Q的新的队尾元素 bool EnQueue(LinkQueue& Q, int e) { QNode* p = new QNode;//为入队元素分配结点空间,用指针p指向 p->data = e;//将新结点数据域置为e p->next = NULL; Q.rear->next = p;//将新结点插入到队尾 Q.rear = p;//修改队尾指针 return true; } //出队 删除队列Q的队头元素,用e返回其值 bool DeQueue(LinkQueue& Q, int &e) { if (Q.front == Q.rear) return false;//若队列为空,则返回false QNode* p = Q.front->next;//生成新结点p指向队头元素 e = p->data;//e保存队头元素的值 Q.front->next = p->next;//修改头结点的指针域 if (Q.rear == p) Q.rear = Q.front;//如果只有一个元素则将队尾指针指向头结点 delete p;//释放队头元素的空间 return true; } //取队头元素 int GetHead(LinkQueue Q) { if (Q.front != Q.rear)//队列不为空 return Q.front->next->data;//返回队头元素的值 } //批量入队(这里默认不会超过最大元素数MAXQSIZE) void QueueInput(LinkQueue& Q) { int value;//用户输入的值 int n = 0;//输入数据的个数 cout << "你想要输入几个数据?" << endl; cin >> n; for (int i = 0; i < n; i++) { cout << "请输入第" << i + 1 << "个数据:"; cin >> value;//输入元素值 if (EnQueue(Q, value)) cout << "入队成功!" << endl; else cout << "入队失败!"; } } //依次出队 void QueueOut(LinkQueue& Q) { int value; cout << "依次出队的值为:\n"; while (DeQueue(Q, value)) cout << value << "\t"; } int main() { int opearateNum = 0;//操作值 LinkQueue Q; InitQueue(Q); while (true) { cout << "1、批量入队\t2、全部依次出队\t3、取队头元素值\t4、出队\t5、入队\t6、退出" << endl; cin >> opearateNum; if (opearateNum == 6) break; switch (opearateNum) { case 1: //数据输入 QueueInput(Q); system("pause"); system("cls"); break; case 2: //依次出队 QueueOut(Q); system("pause"); system("cls"); break; case 3: if (Q.rear == Q.front) cout << "队列无元素" << endl; else cout << "队头元素值为:" << GetHead(Q) << endl; system("pause"); system("cls"); break; case 4: int value;//出队的值 cout << "出队的元素值为:"; if (!DeQueue(Q,value)) cout << "队列无元素!" << endl; else cout << value << endl; system("pause"); system("cls"); break; case 5: int e;//用户输入的值 cout << "请输入入队的值:"; cin >> e; if (EnQueue(Q, e)) cout << "入队成功!" << endl; else cout << "入队失败!" << endl; system("pause"); system("cls"); break; default: cout << "无效操作,请重新输入!" << endl; break; } } }