Skip to main content

Queue

實作一個 queue,方法包含:

  • push()
  • pop()
  • front()

使用 linked list 實作

#include <iostream>

using namespace std;

template <typename T>

class Queue {
private:
// 定義 node 結構
struct Node {
T data;
Node* next;
Node(T val) : data(val), next(nullptr) {}
};

Node* frontPtr;
Node* rearPtr;

public:
// construct queue
Queue() : frontPtr(nullptr), rearPtr(nullptr) {}

// de-construct queue
~Queue() {
while (frontPtr) {
// 刪刪刪,刪到最後一個值
Node* temp = frontPtr;
frontPtr = frontPtr->next;
delete temp;
}
// 刪到最後一個值再給 rearPtr nullptr
rearPtr = nullptr;
}


void push(const T& val) {
// 建立一個 node
Node* newNode = new Node(val);

if (!frontPtr) {
// 如果是空的話,frontPtr = newNode
// 接在 frontPtr 上
frontPtr = newNode;
} else {
// 如果不是空的,rearPtr->next = newNode
// 接在 rearPtr->next 上
rearPtr->next = newNode;
}
// rearPtr = newNode
rearPtr = newNode;
}

void pop() {
// 如果沒有 frontPtr,return error
if (!frontPtr) {
cerr << "Queue is empty. Cannot pop.\n";
return;
}
Node* temp = frontPtr;

// 指到下一個節點
frontPtr = frontPtr->next;

// 刪除 temp
delete temp;

// 如果 frontPtr 刪完了,刪 rearPtr
if (!frontPtr) {
rearPtr = nullptr;
}
}

T front() const {
if (!frontPtr) {
cerr << "Queue is empty. No front element.\n";
exit(EXIT_FAILURE);
}
return frontPtr->data;
}
};

int main() {
Queue<int> myQueue;

myQueue.push(10);
myQueue.push(20);
myQueue.push(30);

std::cout << "Front element: " << myQueue.front() << std::endl;

myQueue.pop();

std::cout << "Front element after pop: " << myQueue.front() << std::endl;

return 0;
}