佇列 (Queue) 與堆疊都是一種有序串列, 也屬於抽象資料型態. 它所有加入與刪除的動作都發生在不同的兩端, 並且符合 "First In, First Out" 的特性. 佇列的觀念就好比搭捷運買票的隊伍, 先到的人可以優先買票, 買完後就從前端離去準備搭捷運, 而隊伍的後端又陸續有新的乘客加入排隊.
認識佇列 :
在佇列實作上可以採用陣列或是串列來建立一個佇列. 不過堆疊只需要一個top 指標指向堆疊頂, 但佇列則需要使用 front 與 rear 兩個指標分別指向前端與尾端. 如下 :
由於佇列是一種抽象式資料結構, 它有以下特性 :
至於佇列的基本運算可以具備以下五種工作定義 :
* CREATE : 建立空佇列
* ADD : 將新資料加入住列的尾端, 傳回新佇列.
* FRONT : 傳回佇列前端的值
* DELETE : 刪除佇列前端的值, 並傳回新佇列.
* EMPTY : 若佇列為空集合, 則為真, 否則為偽.
範例代碼 :
底下我們就簡單以陣列來實作佇列的工作運算, 這裡我們固定將 front 指標指向陣列的第0 個位置, 而 rear 指標則隨著添加成員而移動. 且一開始 rear 設為 -1 表示空佇列.
* JQueue.h 代碼 :
- #include
- #include
- using namespace std;
- #define MAX_QUEUE_SIZE 20 // 定義佇列的大小
- class JQueue{
- protected:
- int rear;
- int _queue[MAX_QUEUE_SIZE];
- public:
- JQueue(){
- rear = -1;
- }
- bool add(int val); // 添加新資料到佇列
- bool isEmpty(); //判斷佇列是否為空
- bool isFull(); // 判斷佇列是否已滿
- bool get(int *val); // 取回佇列的值
- int length(); // 目前佇列的資料數量.
- };
- #include "JQueue.h"
- bool JQueue::add(int val){
- if(!this->isFull()) {
- rear++;
- this->_queue[rear] = val;
- return true;
- }
- cout << "[佇列已滿]" << endl;
- return false;
- }
- bool JQueue::isFull() {
- if((rear+1)==MAX_QUEUE_SIZE) {
- return true;
- } else {
- return false;
- }
- }
- bool JQueue::isEmpty() {
- if(rear>=0) {
- return false;
- } else {
- return true;
- }
- }
- bool JQueue::get(int *val) {
- if(!this->isEmpty()) {
- *val = this->_queue[0];
- for(int i=0; i
- this->_queue[i] = this->_queue[i+1];
- }
- rear--;
- return true;
- } else {
- cout << "[佇列為空!]" << endl;
- *val = -1;
- return false;
- }
- }
- int JQueue::length(){
- return rear+1;
- }
- void ch05_01(bool b) {
- if(b) {
- char ch = 'S';
- int val;
- int gval=-1;
- JQueue queue;
- while(ch != 'E') {
- cout << "[A]存入一個數值, [G] 取出一個數值, [E] 結束, [L] 目前佇列長度 :";
- cin >> ch;
- switch(ch) {
- case 'A':
- cout << "請輸入數值: ";
- cin >> val;
- queue.add(val);
- break;
- case 'G':
- queue.get(&gval);
- if(gval>=0) {
- cout << "取出數值為: " << gval << endl;
- }
- break;
- case 'E':
- cout << "[離開程式]" << endl;
- break;
- case 'L':
- cout << "目前佇列資料數目為: " << queue.length() << endl;
- break;
- default:
- cout << "不合法字元! (" << ch << ")" << endl;
- break;
- }
- }
- }
- }
執行結果 :
補充說明 :
* [ 資料結構 小學堂 ] 堆疊 : 認識堆疊
沒有留言:
張貼留言