使用不带头结点的循环链表实现队列(数据结构)
来源:互联网 发布:ise女装官网淘宝网 编辑:程序博客网 时间:2024/06/09 14:05
我使用类模版来完成循环链表实现队列的操作。首先定义一个结点类node用来保存结点信息,然后定义队列类Queue,接下来我们思考:要完成队列的4个基本操作即
1.判断队列是否为空
2.在队列尾部push进数据
3.从队列头部取出数据
4.删除掉队列首部的元素
我们这个Queue类需要什么成员变量?
答案是: (维护)队列尾部结点、队列大小就够了。
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;}
实验结果截图;
1 0
- 使用不带头结点的循环链表实现队列(数据结构)
- 数据结构(四)——单链表 、带头结点的单链表、循环链表 及其实现
- 数据结构(二)——单链表 、带头结点的单链表、循环链表 及其实现
- C语言实现双向非循环链表(不带头结点)的基本操作
- C语言实现双向非循环链表(不带头结点)的逆序打印
- C语言实现双向非循环链表(不带头结点)的节点插入
- C语言实现双向非循环链表(不带头结点)的清空
- 不带头结点的链表实现
- 不带头结点的循环单向链表
- 数据结构实验-用C++实现带头结点的循环链表
- 带头结点的链队列实现
- C语言实现双向非循环链表(带头结点尾结点)的基本操作
- C语言实现双向非循环链表(带头结点尾结点)的节点插入
- 带头结点的链队列实现(C语言)
- 带头结点的链队列实现(C语言)
- 带头结点的链队列实现(C语言)
- 单链表 、带头结点的单链表、循环链表 及其实现
- 单链表反转问题(带头结点 和 不带头结点的 创建链表过程等)
- Codeforces Round #317 [AimFund Thanks-Round] (Div. 1) B
- hdu 2255 奔小康赚大钱(完美最大权匹配 KM算法)
- CCAnimation源码解析
- 基于opencv的神经网络算法实现两类分类问题的可视化演示
- HDU 1997 汉诺塔VII(递归)
- 使用不带头结点的循环链表实现队列(数据结构)
- QTcpSocket 编程
- Linux 操作系统下如何优雅的卸载软件
- MySQL 插入数据时,中文乱码问题的解决
- [C++11 并发编程] 10 - 对极少修改的数据进行保护
- 《HTTP权威指南》阅读笔记(三)
- 静态链接库LIB和动态链接库DLL的区别
- Aapache: You don't have permission to access / on this server.错误
- UVA10087 Concatenation of Languages(字符hash)