佇列

常見

概念

佇列(queue)是個具有先進先出(FIFO / First In, First Out)的資料結構。可以在佇列的後方做插入的動作,也可以在前方做刪除的動作。Queue 在現實生活中就像排隊一樣,先到的可以先拿,而後到的就要等前面的都被 pop 以後才會輪到他。

Queue 最基本的幾個操作有這些:

push

queue 中的 push 函式是用來在 queue 的尾端加入新的元素。

pop

queue 中的 pop 函式是用來刪除 queue 中排在最前面的值。

front

queue 中的 front 函式就是用來求出最前面的值,也就是下一個會被 pop 的值。

size / empty

就像其他的資料結構一樣,queue 也支援查詢目前的大小及是否為空。

用陣列實作

就像堆疊(stack)一樣,queue 也可以輕易的用 vector 實作出來(一般的陣列也可以)。這裡提供一個用 vector 實作的程式碼:

vector<int> queue;
int left = 0;

// 將 x 推到 queue 的尾端
void push(int x) {
    queue.push_back(x);
}

// 查詢 queue 的大小
int size() {
    return queue.size() - left;
}

// 將最前端的元素刪除
void pop() {
    if (size() > 0){
        left++;
    }
}

// 查詢最前端的元素
int front() {
    if (size() > 0){
        return queue[left];
    }
    return 0;
}

// queue 是否為空
bool empty(){
    return (size() == 0);
}

STL 內建 queue 使用方式

就像 stack 一樣,可以使用 C++ STL 中的 queue 來使用 queue,需要先引入 <queue> 的標頭檔。

// 創造一個 queue
queue<int> my_queue;

// 將 1 推入 queue 的尾端
my_queue.push(1);

// 將 2 推入 queue 的尾端
my_queue.push(2);

// 印出 1
cout << my_queue.front() << "\n";

// 把最前端的 1 刪除
my_queue.pop();

// 印出 2
cout << my_queue.front() << "\n";

// 印出 1
cout << my_queue.size() << "\n";

小測驗

一個 queue 的元素依序為 {1, 2, 3},當呼叫 pop 的時候會刪除哪一個元素