C++學習---佇列的構建及操作
阿新 • • 發佈:2020-10-08
一、迴圈佇列
#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; } } }