博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构-队列(队列的基本实现C++)
阅读量:4093 次
发布时间:2019-05-25

本文共 4364 字,大约阅读时间需要 14 分钟。

​栈和队列是两种重要的线性结构。从数据结构角度看,栈和队列也是线性表,其特殊在于栈和队列的基本操作是线性表操作的子集,他们是操作受限的线性表。但是从数据类型角度看,他们是和线性表大不相同的抽象数据类型。

与栈相反,队列是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端删除元素,跟我们平时排队是一个道理。

队列也有两种存储表示方法:顺序存储和链式存储,顺序存储常见的就是环形队列,初始化时必须指定队列容量大小;普通队列基于链表。

以下是对队列抽象数据类的基本实现:

CQueue.hpp

1、环形队列 基于数组 初始化时必须指定队列容量大小

#include 
#include "assert.h"using namespace std;​template
class CircularQueue{private: T *m_pQueue; //指向环形队列数据的指针 int m_iHead; //游标 int m_iLenth; //队列实际长度 int m_iCapacity; //队列容量大小public: CircularQueue(int capacity); //构造函数,指定队列容量大小,初始化队列​ ~CircularQueue(); //析构函数​ bool empty();//队列判空​ bool full(); //判断是否满队列​ int size(); //获取队列实际长度​ int capacity();//获取队列容量大小​ bool push(T t);//入队​ bool pop(T &t);//出对​ void traverse();};​template
CircularQueue
::CircularQueue(int capacity) : m_iCapacity(capacity), m_iLenth(0), m_iHead(0){ m_pQueue = new T[m_iCapacity];}​template
CircularQueue
::~CircularQueue() { delete m_pQueue; m_pQueue = nullptr;}​template
bool CircularQueue
::empty() { return 0 == m_iLenth; }​template
bool CircularQueue
::full(){ return m_iLenth == m_iCapacity;}​template
int CircularQueue
::size() { return m_iLenth; }​template
int CircularQueue
::capacity(){ return m_iCapacity; }​template
bool CircularQueue
::push(T t){ if (full()) { std::cout << "队列已满,插入失败:" << t << endl; return false; }​ m_pQueue[m_iHead] = t; m_iHead++; m_iHead %= m_iCapacity; m_iLenth++; return true;}​template
bool CircularQueue
::pop(T &t){ if (empty()) { std::cout << "队列为空。" << endl; return false; }​ t = m_pQueue[m_iHead]; m_iHead++; m_iHead %= m_iCapacity; m_iLenth--; return true;}template
void CircularQueue
::traverse(){ for (int i = m_iHead; i < m_iHead + m_iLenth; i++) std::cout << m_pQueue[i%m_iCapacity] << " ";​ std::cout << std::endl; std::cout <<"m_iHead: " << m_iHead << std::endl;}

 

2、普通队列实现,基于链表

#include 
#include "assert.h"using namespace std;​template
class CQueueNode{public: T data; CQueueNode *next;public: CQueueNode(T t) :data(t), next(NULL) {} ~CQueueNode() { next = NULL; } CQueueNode(const CQueueNode& node) { if (this == &node) { return; } *this = node; } CQueueNode& operator=(const CQueueNode& node) { if (this == &node) { return *this; }​ this->data = node.data; this->next = node.next; return *this; }};​//普通队列实现 基于链表template
class CQueue{private: CQueueNode
* head; CQueueNode
* tail; CQueueNode
* node; int m_iSize;public: CQueue() :head(NULL), tail(NULL), node(NULL), m_iSize(0) {}​ ~CQueue() { delete head; delete tail; delete node;​ head = NULL; tail = NULL; node = NULL; }​ int size(); bool empty(); void push(T t); T pop(); T front(); T back(); void traverse();​};​template
int CQueue
::size(){ return m_iSize;}​template
bool CQueue
::empty(){ return 0 == m_iSize;}​template
void CQueue
::push(T t){ node = new CQueueNode
(t); if (head == NULL) { head = tail = node; } else { tail->next = node; tail = node; } m_iSize++;}​template
T CQueue
::pop(){ if (empty()) { throw "empty queue."; }​ node = head; head = head->next; m_iSize--;​ return node->data;}​template
T CQueue
::front(){ if (empty()) { throw "empty queue."; }​ return head->data;}​template
T CQueue
::back(){ if (empty()) { throw "empty queue."; }​ return tail->data;}​template
void CQueue
::traverse(){ CQueueNode
*node = head; while (node != NULL) { cout << node->data << " "; node = node->next; }​ std::cout << endl;}

 

main.cpp

int main(int argc, char**argv){  cout << "***环形队列***" << endl;  CircularQueue
cq(5); cq.push(2); cq.push(3); cq.push(5); cq.push(14); cq.push(15); cq.traverse(); cq.push(36); cq.traverse(); int val = -1; cq.pop(val); cout << "出栈元素:" << val << endl; cq.traverse(); val = 36; cq.push(val); cout << "入栈元素:" << val << endl; cq.traverse(); cout << endl; cout << "***普通队列***" << endl; CQueue
 queue; queue.push('I'); queue.push('t'); queue.push(' '); queue.push('C'); queue.push('o'); queue.push('n'); queue.push('t'); queue.push('a'); queue.push('i'); queue.push('n'); queue.push('e'); queue.push('r'); queue.traverse(); cout << queue.front() << endl; cout << queue.back() << endl; char c = queue.pop(); cout << c << endl; queue.traverse(); system("pause"); return 0;}

 

执行结果:

 

 

--|END|--


 

 

转载地址:http://ieiii.baihongyu.com/

你可能感兴趣的文章
Logstash过滤器插件filter
查看>>
Logstash输入源的三种配置方式
查看>>
CSS中hover的使用细节
查看>>
Ant Design Vue中change等方法如何传递自定义参数
查看>>
Springboot的logback-spring.xml配置
查看>>
URI中特殊字符的处理
查看>>
Linux中使用ps命令查看进程的介绍
查看>>
RBAC:基于角色的权限访问控制
查看>>
Linux中使用nohup实现后台运行程序
查看>>
nc命令介绍
查看>>
netstat命令介绍
查看>>
Java知识:变量在内部类中被使用的话必须在内部类外部声明为final
查看>>
Mysql实现同表数据复制插入
查看>>
Springboot项目以war包形式部署到外部Tomcat
查看>>
SpringBoot项目以war包形式部署至外部tomcat
查看>>
Maven中scope标签的作用
查看>>
IDEA编辑器启动使用外部tomcat的工程
查看>>
Git 修改本地项目的远程仓库地址
查看>>
Logback configuration error detected的终极解决方案
查看>>
前端访问使用Tomcat启动的后端服务报跨域问题的解决办法
查看>>