使用不带头结点的循环链表实现队列(数据结构)
2017-06-19 12:50
471 查看
我使用类模版来完毕循环链表实现队列的操作。首先定义一个结点类node用来保存结点信息,然后定义队列类Queue。接下来我们思考:要完毕队列的4个基本操作即
1.推断队列是否为空
2.在队列尾部push进数据
3.从队列头部取出数据
4.删除掉队列首部的元素
我们这个Queue类须要什么成员变量?
答案是: (维护)队列尾部结点、队列大小就够了。
我们来分析。尾部push数据的时候,我们仅仅须要在myback和myback->next之间插入这个结点。然后把这个myback指向这个结点就可以。取出和删除头部数据仅仅须要对myback->next进行操作就可以,复杂度是O(1),效率非常高。
剩下的一些实现细节看我以下的代码实现:
进行測试:
实验结果截图;
1.推断队列是否为空
2.在队列尾部push进数据
3.从队列头部取出数据
4.删除掉队列首部的元素
我们这个Queue类须要什么成员变量?
答案是: (维护)队列尾部结点、队列大小就够了。
我们来分析。尾部push数据的时候,我们仅仅须要在myback和myback->next之间插入这个结点。然后把这个myback指向这个结点就可以。取出和删除头部数据仅仅须要对myback->next进行操作就可以,复杂度是O(1),效率非常高。
剩下的一些实现细节看我以下的代码实现:
//circle_list.h #ifndef CIRCLE_LIST #define CIRCLE_LIST #include<iostream> #include<string> #include<cstring> template <typename T> class node//节点类 { public: T data; node *next; node(T da = 0, node *n = NULL) :data(da), next(n){} }; template <typename T> class Queue { public: node<T> *myback; int size; Queue(node<T> *begin = NULL, int s = 0) :myback(begin),size(s){} bool empty(); void enqueue(T value);//后面压入 T front(); void display(); void dequeue();//前面删除 ~Queue(); Queue(const Queue<T> &temp); Queue<T> operator=(const Queue<T>temp); }; template <typename T> bool Queue<T>::empty() { if (size == 0) return true; return false; } template <typename T> Queue<T>::Queue(const Queue<T> &temp) { size = 0; node<T>* scan = (temp.myback)->next; while (scan != temp.myback) { enqueue(scan->data); scan = scan->next; } enqueue(temp.myback->data); } template <typename T> Queue<T> Queue<T>::operator=(const Queue<T> temp) { size = 0; node<T>* scan = (temp.myback)->next; while (scan != temp.myback) { enqueue(scan->data); scan = scan->next; } enqueue(temp.myback->data); return *this; } template <typename T> void Queue<T>::enqueue(T value) { node<T>*last = new node<T>; last->data = value; if (size == 0) { myback = last; myback->next = myback; } else { node<T> *temp = myback->next; myback->next = last; last->next = temp; myback = last; myback->next = temp; } size++; } template <typename T> T Queue<T>::front() { return (myback->next)->data; } template <typename T> void Queue<T>::display() { if (size == 1) { cout << myback->data << endl; return; } else { node<T> *first = myback->next; while (first != myback) { cout << first->data << " "; first = first->next; } cout << myback->data; cout << endl; } } template <typename T> void Queue<T>::dequeue() { node<T>*cur = myback->next; node <T>*now = cur->next; myback->next = now; delete cur; size--; } template <typename T> Queue<T>::~Queue() { if (size == 0){} else { node<T> *p = myback->next; node<T> *nex = p->next; while (p != myback) { delete p; p = nex; nex = nex->next; } delete myback; } } #endif
进行測试:
//main.cpp #include"circle_list.h" using namespace std; int main() { Queue<int> q; cout <<"队列是否为空?"<< q.empty() << endl; q.enqueue(1); q.enqueue(2); q.enqueue(3); cout << "输出第一个队列中的数据:" << endl; q.display(); Queue<int> a(q); cout << "输出通过拷贝构造函数建立的队列中的数据:" << endl; a.display(); Queue<int> b; b = q; cout << "输出通过赋值运算符重载建立的队列中的数据:" << endl; b.display(); cout << "输出队列首的元素:" << endl; cout << q.front() << endl; q.dequeue(); cout << "删除队首元素后的队列:" << endl; q.display(); //cout << q.empty() << endl; return 0; }
实验结果截图;
相关文章推荐
- 使用不带头结点的循环链表实现队列(数据结构)
- 3.6使用带头结点的循环链表链表表示队列
- 带头结点的链队列实现(C语言)
- 使用JavaScript的数组实现数据结构中的队列与堆栈
- 数据结构-java与c实现带头结点的单链表
- 数据结构模版----单链表SimpleLinkList[带头结点](C语言实现)
- 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
- 数据结构循环队列,数组实现,循环队列中如果不使用数据项计数字段items,而是通过front和rear计算队列是否为空或满或队列个数,那会很复杂
- 经典算法与数据结构的c++实现——带头结点的单链表
- Java基础课程学习总结,使用LinkedList简单模拟队列数据结构和堆栈数据结构的实现
- 数据结构(二)——单链表 、带头结点的单链表、循环链表 及其实现
- 【c++版数据结构】之循环双链表的实现(带头结点以及尾节点)
- 数据结构_使用二叉堆实现优先队列
- 使用JavaScript的数组实现数据结构中的队列与堆栈
- 使用JavaScript的数组实现数据结构中的队列与堆栈
- C语言实现使用带头结点的单链表来构造栈结构
- Lua中使用table实现的其它5种数据结构(数组、链表、队列、集合和包、StringBuild)
- 带头结点的链队列实现(C语言)
- 用C++实现数据结构二 带头结点的单链表
- 【c++版数据结构】之单链表的实现(带头结点以及尾节点)