队列的连续与链式实现
来源:互联网 发布:unity3d找工作好难 编辑:程序博客网 时间:2024/06/05 04:03
STL中已经有<stack>和<queue>了,写在这里是帮助理解这两种数据结构。
队列:只能在表的前端进行删除(pop)操作,而在表的后端进行插入(push)操作,就像人们排队一样。
连续队列(数组):
#include <iostream>using namespace std;const int queueSize = 10000;template <class Queue_entry>class Queue{ // Contiguous Queuepublic:Queue();void pop(); /*pre: make sure the Queue is not empty */Queue_entry front() const;/*pre: make sure the Queue is not empty */Queue_entry back() const; /*pre: make sure the Queue is not empty */bool push(const Queue_entry&);bool empty() const;int size() const;private:Queue_entry entry[queueSize];int count;int head;int tail;};template <class Queue_entry>Queue<Queue_entry> :: Queue(){count = 0;head = 0;tail = 0;}template <class Queue_entry>void Queue<Queue_entry> :: pop(){if(count > 0){count--;if(count) // if queue has only one entry, then head = tail when pop a entryhead = (head-1+queueSize)%queueSize; }/*else underflow*/return;}template <class Queue_entry>Queue_entry Queue<Queue_entry> :: front() const{ if(count > 0){return entry[head]; } /* return underflow */}template <class Queue_entry>Queue_entry Queue<Queue_entry> :: back() const{ if(count > 0){return entry[tail]; } /* return underflow */}template <class Queue_entry>bool Queue<Queue_entry> :: push(const Queue_entry& newEntry){if(count < queueSize){if(count)// if queue is empty, then head = tail when push a entry tail = (tail-1+queueSize)%queueSize;++count; entry[tail] = newEntry;return true;}return false/*overflow*/;}template <class Queue_entry>bool Queue<Queue_entry> :: empty() const{return count == 0;}template <class Queue_entry>int Queue<Queue_entry> :: size() const{return count;}int main(){Queue<int> s;for(int i = 0; i < 10; i++){s.push(10-i);}while(!s.empty()){cout << "size: " << s.size() << endl;cout << "front: " << s.front() << endl;cout << "back: " << s.back() << endl;cout << endl;s.pop();}return 0;}
链式队列(链表):
#include <iostream>using namespace std;template <typename Node_entry>struct Node{Node_entry entry;Node* next;Node(){next = NULL;}Node(const Node_entry& newEntry, Node* add_on = NULL){entry = newEntry;next = add_on;}};template <class Queue_entry>class Queue{ // Linked Queuepublic:Queue();Queue(const Queue& original);~Queue();void pop(); /*pre: make sure the Queue is not empty */Queue_entry front() const;/*pre: make sure the Queue is not empty */Queue_entry back() const; /*pre: make sure the Queue is not empty */void push(const Queue_entry&);bool empty() const;int size() const;//Queue& operator=(const Queue& original);//private:Node<Queue_entry>* head;Node<Queue_entry>* tail;int count;};template <class Queue_entry>Queue<Queue_entry> :: Queue(){head = NULL;tail = NULL;count = 0;}template <class Queue_entry>Queue<Queue_entry> :: Queue(const Queue& original){count = original.count;Node<Queue_entry> *new_copy, *original_head = original.head;if(original_head == NULL) head = tail = NULL;else{head = new_copy = new Node<Queue_entry>(original_head->entry);while(original_head->next != NULL){original_head = original_head->next;new_copy->next = new Node<Queue_entry>(original_head->entry);new_copy = new_copy->next;}}}template <class Queue_entry>Queue<Queue_entry> :: ~Queue(){count = 0;Node<Queue_entry>* old_node;tail = NULL;//cout << "test ~Queue" << endl;while(head != NULL){old_node = head;//cout << old_node->entry << endl;head = head -> next;delete old_node;}}template <class Queue_entry>void Queue<Queue_entry> :: pop(){if(head != NULL){--count;Node<Queue_entry>* old_node = head;if(head == tail) tail = NULL; // queue only has one entry head = head->next;delete old_node;}/*else underflow*/return;}template <class Queue_entry>Queue_entry Queue<Queue_entry> :: front() const{ if(head != NULL){return head->entry; } /* return underflow */}template <class Queue_entry>Queue_entry Queue<Queue_entry> :: back() const{ if(tail != NULL){return tail->entry; } /* return underflow */}template <class Queue_entry>void Queue<Queue_entry> :: push(const Queue_entry& newEntry){Node<Queue_entry>* new_tail = new Node<Queue_entry>(newEntry);//if(new_head == NULL) return/*overflow*/; // the dynamic memory is exhausted++count;if(tail == NULL){ // queue is empty head = tail = new_tail;return;}tail->next = new_tail;tail = new_tail;return;}template <class Queue_entry>bool Queue<Queue_entry> :: empty() const{return count == 0;}template <class Queue_entry>int Queue<Queue_entry> :: size() const{return count;}template <class Queue_entry>Queue<Queue_entry>& Queue<Queue_entry> :: operator=(const Queue<Queue_entry>& original){count = original.count;while(head != NULL) pop();Node<Queue_entry> *new_copy, *original_head = original.head;if(original_head == NULL) head = tail = NULL;else{head = new_copy = new Node<Queue_entry>(original_head->entry);while(original_head->next != NULL){original_head = original_head->next;new_copy->next = new Node<Queue_entry>(original_head->entry);new_copy = new_copy->next;}}return *this;}int main(){{ // test ~QueueQueue<int> s;for(int i = 0; i < 10; i++){s.push(10-i);}}Queue<int> s;for(int i = 0; i < 10; i++){s.push(10-i);}while(!s.empty()){cout << "size: " << s.size() << endl;cout << "front: " << s.front() << endl;cout << "back: " << s.back() << endl;cout << endl;s.pop();}return 0;}
0 0
- 队列的连续与链式实现
- 循环队列与链式队列的实现
- 栈的连续与链式实现
- 队列的链式表示与实现
- 队列的链式表示与实现
- 链式队列的基本操作与实现
- 链式队列的实现
- 链式队列的实现
- 链式队列的实现
- 链式队列的实现。
- 链式队列的实现
- 链式队列的实现
- 链式队列的实现
- 队列的链式实现
- 链式队列的实现
- 链式队列的实现
- 链式队列的实现
- 链式队列的实现
- android四种更新UI的方法
- 定义文件流对象,统计字符个数(C/C++源程序)
- 追MM与设计模式
- EditText,TextView,Button,ImageVIew样式
- Solr 3.5 + Tomcat7 + mmseg4j + 搜狗词库 -配置并运行
- 队列的连续与链式实现
- nyoj 最长公共子序列 36 (简单LCS模板)
- [转载]A*寻路算法
- Ralink WIFI driver up/off流程分析
- 黑马程序员-----确定一个字符串中包含几个数字的问题
- A different object with the same identifier value was already associated wit
- MYSQL主从同步故障一例及解决过程!
- oracle中的to_char数字转换为字符串格式
- Flume学习8_Flume1.5.0入门:安装、部署、及flume的案例