資料結構 筆記:佇列的概念及實現(上)
阿新 • • 發佈:2018-12-17
佇列是一種特殊的線性表
佇列僅能線上性表的兩端進行操作
-隊頭(Front):取出資料元素的一端
-隊尾(Rear):插入資料元素的一端
佇列的特性
-先進先出
佇列的操作
-建立佇列
-銷燬佇列(Queue())
-清空佇列(~Queue())
-進佇列(add())
-出佇列(remove())
-獲取對頭元素(front())
-獲取佇列的長度(length())
template <typename T> class Queue :public Object { public: virtual void add(const T& e) = 0; virtual void remove() = 0; virtual T front() const = 0; virtual void clear() = 0; virtual int length() const = 0; };
StaticQueue設計要點
-類模板
·使用原生陣列作為佇列的儲存空間
·使用模板引數決定佇列的最大容量
template <typename T, int N> class StaticQueue : public Queue<T> { protected: T m_space[N]; int m_front; int m_rear; int m_length; public: StaticQueue() { m_front = 0; m_rear = 0; m_length = 0; } int capacity() const { return N; } void add(const T &e) { if(m_length < N) { m_space[m_rear + 1] = e; m_rear = (m_rear + 1) % N; m_length++; } else { //丟擲異常 } } void remove() { if(m_length > 0) { m_front = (m_front + 1) % N; m_length--; } else { //丟擲異常 } } T front() const { if(m_length > 0) { return m_space[m_front]; } else { //丟擲異常 } } void clear() { m_front = 0; m_rear = 0; m_length = 0; } int length() const { return m_length; } };
StaticQueue實現要點(迴圈計數法)
-關鍵操作
·進佇列:m_space[m_rear] = e;m_rear = (m_rear + 1) % N;
·出佇列:m_front = (m_front + 1)% N;
-佇列的狀態
·隊空:(m_length == 0) && (m_front == m_rear)
·隊滿:(m_length == N)&&(m_front == m_rear)
總結:
佇列是一種特殊的線性表,具有先進先出的特性
-佇列值允許線上性表的兩端進行操作,一端進,一端出
-StaticQueue使用原生陣列作為內部儲存空間
-StaticQueue的最大容量由模板引數決定
-StaticQueue採用迴圈計數法提高佇列操作的效率