佇列本質上是一種特殊的線性表,它是在一端(隊首)進行刪除操作,而在另外一端(隊尾)進行插入操作,它要遵循先進先出的規則。
隊首(front) :允許進行刪除的一端稱為隊首。
隊尾(rear) :允許進行插入的一端稱為隊尾。
佇列有兩種資料儲存方式:1、順序儲存結構(靜態佇列,用陣列實現,位址是連續的)。2、鏈式儲存結構(動態佇列,用動態鍊錶實現,位址是不連續的)。
一、佇列的基本操作:
queue 模板類的定義在標頭檔案中。
與stack 模板類很相似,queue 模板類也需要兩個模板引數,乙個是元素型別,乙個容器類
型,元素型別是必要的,容器型別是可選的,預設為deque 型別。
定義queue 物件的示例**如下:
queue q1;
queue q2;
queue 的基本操作有:
入隊,如例:q.push(x); 將x 接到佇列的末端。
出隊,如例:q.pop(); 彈出佇列的第乙個元素,注意,並不會返回被彈出元素的值。
訪問隊首元素,如例:q.front(),即最早被壓入佇列的元素。
訪問隊尾元素,如例:q.back(),即最後被壓入佇列的元素。
判斷佇列空,如例:q.empty(),當佇列空時,返回true。
以下是queue最基本的用法:
#include
#include
#include
using
namespace
std;
int main()
cout
cout
<
system("pause");
return
0;}
順序儲存結構:這種結構事先要基本確定佇列的大小,不支援動態分配儲存空間,所以插入和刪除元素比較省時,但是會造成空間的浪費。為了節省空間,這裡引入了迴圈佇列,本質上也是順序儲存結構。
鏈式儲存結構:可以不需要事先知道佇列的大小,支援動態和釋放空間,但是插入和刪除操作比較耗時,也稱鏈佇列。
建議:當事先基本上確定佇列的大小,且插入和刪除操作比較頻繁時,優先考慮迴圈佇列。。
1.迴圈佇列實現:
標頭檔案宣告和定義放一塊了,只實現了基本的操作,不是很完善,等看了原始碼再改。。
標頭檔案:在queue.h標頭檔案中
#ifndef queue_h
#define queue_h
#include
#include
using
namespace
std;
template
class queue
;template
queue::queue(int maxsize) :front(0), rear(0),capacity(maxsize)
template
queue::queue(const queue& rhs) :front(rhs.front), rear(rhs.rear),capacity(rhs.capacity)
template
queue& queue::operator=(const queue& rhs)
return *this;
}template
queue::~queue()
template
bool queue::empty() const
template
bool queue::isfull() const
template
int queue::size() const
template
void queue::push(const t& data)
else
//當佇列滿了之後可進行擴容
delete [ ] array;
array = newarray;
front = 0;
array[rear] = data;
rear =this->rear+1;
capacity = 2*capacity;
}}template
void queue::pop()
else
cout
<
t& queue::front()
template
t queue::front() const
template
t& queue::back()
template
t queue::back() const
#endif // queue_h
測試**:
網上找的**:
#include
#include"queue.h"
using namespace std;
int main()
}cout << endl;
return
0;}
2.鏈佇列的實現:
標頭檔案:
在queue1.h標頭檔案中
#ifndef queue_h1
#define queue_h1
/**********在隊頭刪除節點,隊尾新增節點*************/
#include
using
namespace
std;
template
class queue
// queuenode() = default;
};queuenode * front; //隊頭指標
queuenode * rear; // 隊尾指標
int count;
};//此處不設頭節點
template
queue::queue() :front (null), rear (null), count(0)
{}template
queue::~queue()
template
void queue::push(const t & node)
count++;
}template
bool queue::empty() const
template
int queue::size() const
template
void queue::clear()
count = 0;
}template
void queue::pop()
queuenode * frontofqueue = front;
front = front->next;
delete frontofqueue;
count--;
}template
t& queue::front()
return front->data;
}template
t queue::front() const
return front->data;
}#endif // queue_h1
測試**:
#
#include"queue1.h"
using
namespace
std;
int main()
}cout
<< endl;
return
0;}
優先佇列的用法
在優先佇列中,優先順序高的元素先出佇列。標準庫預設使用元素型別的 操作符來確定它們之間的優先順序關係。優先佇列的第一種用法,也是最常用的用法 int qi 通過 操作符可知在整數中元素大的優先順序高。故示例1中輸出結果為 9 6 5 3 2 第二種方法 在示例1中,如果我們要把元素從小到大輸出怎麼辦...
Queue佇列的用法
佇列是一種特殊的線性表,它只允許在表的前端進行刪除操作,而在表的後端進行插入操作。遵循的是先入先出的原則。陣列的使用方法 使用陣列模擬佇列 一般來說,front指向頭部,且指向頭部的前乙個位子 rear指向尾部 包含尾部的資料 使用陣列模擬佇列 編寫乙個arrayqueue class arrayq...
優先佇列用法
在優先佇列中,優先順序高的元素先出佇列。標準庫預設使用元素型別的 操作符來確定它們之間的優先順序關係。優先佇列的第一種用法,也是最常用的用法 priority queueqi 通過 操作符可知在整數中元素大的優先順序高。故示例1中輸出結果為 9 6 5 3 2 第二種方法 在示例1中,如果我們要把元...