数据结构基础(14) --链式队列的设计与实现
生活随笔
收集整理的這篇文章主要介紹了
数据结构基础(14) --链式队列的设计与实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? ? 鏈?zhǔn)疥?duì)列是基于單鏈表的一種存儲(chǔ)表示,?其形狀如下圖所示:
?
? ? (隊(duì)列的隊(duì)頭指針指向單鏈表的第一個(gè)結(jié)點(diǎn),?隊(duì)尾指針指向單鏈表的最后一個(gè)結(jié)點(diǎn),?注意沒有無用的空[頭/尾]節(jié)點(diǎn))
? ? 用單鏈表表示的鏈?zhǔn)疥?duì)列特別適合于數(shù)據(jù)元素變動(dòng)比較大的情況,?而且不存在隊(duì)列滿而產(chǎn)生溢出的情況;
?
鏈?zhǔn)疥?duì)列結(jié)點(diǎn)構(gòu)造:
[這次我們將節(jié)點(diǎn)構(gòu)造成了類LinkQueue的嵌套類]
struct ChainNode {ChainNode(const Type &_data, ChainNode *_next = NULL):data(_data), next(_next) {}Type data;ChainNode *next; };
鏈?zhǔn)疥?duì)列構(gòu)造:
template <typename Type> class LinkQueue {template <typename T>friend ostream &operator<<(ostream &os, LinkQueue<T> &queue); public:LinkQueue();~LinkQueue();bool isEmpty() const;void push(const Type &data);void pop();//返回隊(duì)首元素const Type &front() const;//返回隊(duì)尾元素const Type &back() const;//清空隊(duì)列void makeEmpty();private:struct ChainNode{ChainNode(const Type &_data, ChainNode *_next = NULL):data(_data), next(_next) {}Type data;ChainNode *next;};private:ChainNode *m_front; //隊(duì)首指針[注意不是指向一個(gè)無用的空節(jié)點(diǎn)]ChainNode *m_back; //隊(duì)尾指針[注意不是指向一個(gè)無用的空節(jié)點(diǎn)] };隊(duì)列的構(gòu)造與析構(gòu):
template <typename Type> LinkQueue<Type>::LinkQueue() {m_front = m_back = NULL; } template <typename Type> LinkQueue<Type>::~LinkQueue() {makeEmpty(); }隊(duì)列的四大操作:
//入隊(duì), 這是鏈?zhǔn)疥?duì)列的關(guān)鍵 template <typename Type> void LinkQueue<Type>::push(const Type &data) {if (isEmpty()){//如果隊(duì)列為空//則隊(duì)首與隊(duì)尾指針共同指向一個(gè)新構(gòu)造的對象m_front = m_back = new ChainNode(data);}else{//首先讓隊(duì)尾的下一位置指向一個(gè)新構(gòu)造的對象m_back->next = new ChainNode(data);//然后隊(duì)尾指針后移m_back = m_back->next;} } //出隊(duì) template <typename Type> void LinkQueue<Type>::pop() {if (isEmpty())throw std::range_error("queue is empty");ChainNode *deleteNode = m_front;// 隊(duì)首指針后移m_front = m_front->next;delete deleteNode; } //取隊(duì)首元素 template <typename Type> const Type &LinkQueue<Type>::front() const {if (isEmpty())throw std::range_error("queue is empty");return (m_front->data); } //取隊(duì)尾元素 template <typename Type> const Type &LinkQueue<Type>::back() const {if (isEmpty())throw std::range_error("queue is empty");return (m_back->data); }清空隊(duì)列與判空操作:
template <typename Type> void LinkQueue<Type>::makeEmpty() {while (!isEmpty()){pop();} } template <typename Type> bool LinkQueue<Type>::isEmpty() const {return (m_front == NULL); }輸出隊(duì)列所有元素(以做測試):
template <typename Type> ostream &operator<<(ostream &os, LinkQueue<Type> &queue) {for (typename LinkQueue<Type>::ChainNode *currentNode = queue.m_front;currentNode != NULL;currentNode = currentNode->next){os << currentNode->data << ' ';}return os; }附-測試代碼:
int main() {LinkQueue<int> queue;for (int i = 0; i < 10; ++i){queue.push(rand()%100);}cout << queue << endl;cout << queue.front() << endl;queue.pop();cout << queue.front() << endl;cout << queue.back() << endl;cout << queue << endl;LinkQueue<char> cQueue;cQueue.push('A');cout << "cQueue.front = " << cQueue.front() << endl;cout << "cQueue.back = " << cQueue.back() << endl;cQueue.pop();cout << cQueue << endl;try{cout << "cQueue.front = " << cQueue.front() << endl;cout << "cQueue.back = " << cQueue.back() << endl;}catch(const std::exception &e){cerr << e.what() << endl;}return 0; }總結(jié)
以上是生活随笔為你收集整理的数据结构基础(14) --链式队列的设计与实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHPRPC for PHP
- 下一篇: archlinux包管理器--pacma