数据结构基础——循环队列的C++实现
来源:互联网 发布:点菜软件免费下载 编辑:程序博客网 时间:2024/05/22 13:39
一、定义存储基本数据类型的队列
1、创建文件LoopQueue.h ,定义表示队列的类
#ifndef LOOP_QUEUE_H#define LOOP_QUEUE_H/**环形队列的C++实现C++的类名并不比与类名相同**/class LoopQueue{public: LoopQueue(int queueCapacity);//initQueue(&Q)创建队列 virtual ~LoopQueue(); //destoryQueue(&Q)销毁队列 void clearQueue(); //clearQueue(&Q)清空队列 bool queueEmpty() const; //queueEmpty(&Q)判空队列 bool queueFull() const; //queueFull(&Q)判满队列 int queueLength() const; //queueLength(&Q)判断队列的长度 bool enQueue(int element); //enQueue(&Q element)进入队列 bool deQueue(int &element); //deQueue(&Q element)首元素出队 void queueTraverse(); //queueTraverse(&Q,visit())遍历队列private: int *m_lqueue; //队列数组首指针 int m_lqueueLen; //队列长度 int m_lqueueCapacity; //队列容量 int m_lqueueHead; int m_lqueueTail;};#endif // LOOP_QUEUE2、创建文件LoopQueue.cpp ,实现定义的方法
#include "MyQueue.h"#include <iostream>using namespace std;LoopQueue::LoopQueue(int queueCapacity){ m_lqueueCapacity = queueCapacity; m_lqueue = new int[queueCapacity]; clearQueue();}LoopQueue::~LoopQueue(){ delete[] m_lqueue; m_lqueue = NULL;}bool LoopQueue::queueEmpty()const{ return m_lqueueLen == 0?true:false;}bool LoopQueue::queueFull() const{ return m_lqueueLen == m_lqueueCapacity?true:false;}int LoopQueue::queueLength()const{ return m_lqueueLen;}void LoopQueue::clearQueue(){ m_lqueueLen = 0; m_lqueueHead = 0; m_lqueueTail = 0;}bool LoopQueue::enQueue(int element){ if(queueFull()) return false; m_lqueue[m_lqueueTail] = element; m_lqueueTail++; m_lqueueTail = m_lqueueTail % m_lqueueCapacity; m_lqueueLen++; return true;}bool LoopQueue::deQueue(int &element){ if(queueEmpty()) return false; element = m_lqueue[m_lqueueHead]; m_lqueueHead++; m_lqueueHead = m_lqueueHead % m_lqueueCapacity; m_lqueueLen--; return true;}/**遍历函数注意i循环的起点和终点是极易出错的**/void LoopQueue::queueTraverse(){ cout<<"遍历队列---------------------------------------"<<endl; for(int i = m_lqueueHead;i < m_lqueueLen + m_lqueueHead;i++){ cout<<m_lqueue[i%m_lqueueCapacity]<<endl; } cout<<"遍历结束---------------------------------------"<<endl;}3、在main函数中写如下代码,测试实现的队列是否正确
#include <iostream>#include "MyQueue.h"using namespace std;int main(){ LoopQueue *p = new LoopQueue(4); p->enQueue(1); p->enQueue(2); p->enQueue(3); p->enQueue(4); p->enQueue(5); p->queueTraverse(); int e = 0; p->deQueue(e); cout<<"e="<<e<<endl; p->deQueue(e); cout<<"e="<<e<<endl; p->queueTraverse(); p->clearQueue(); p->queueTraverse(); p->enQueue(6); p->enQueue(7); p->queueTraverse(); delete p; p = NULL; return 0;}二、定义存储Object类型的队列
1、创建文件LoopQueue.h
#ifndef LOOP_QUEUE_H#define LOOP_QUEUE_H#include "Customer.h"/**环形队列的C++实现C++的类名并不比与类名相同**/class LoopQueue{public: LoopQueue(int queueCapacity);//initQueue(&Q)创建队列 virtual ~LoopQueue(); //destoryQueue(&Q)销毁队列 void clearQueue(); //clearQueue(&Q)清空队列 bool queueEmpty() const; //queueEmpty(&Q)判空队列 bool queueFull() const; //queueFull(&Q)判满队列 int queueLength() const; //queueLength(&Q)判断队列的长度 bool enQueue(Customer element); //enQueue(&Q element)进入队列 bool deQueue(Customer &element); //deQueue(&Q element)首元素出队 void queueTraverse(); //queueTraverse(&Q,visit())遍历队列private: Customer *m_lqueue; //队列数组首指针 int m_lqueueLen; //队列长度 int m_lqueueCapacity; //队列容量 int m_lqueueHead; int m_lqueueTail;};#endif // LOOP_QUEUE
2、创建文件LoopQueue.cpp
#include "MyQueue.h"#include <iostream>using namespace std;LoopQueue::LoopQueue(int queueCapacity){ m_lqueueCapacity = queueCapacity; m_lqueue = new Customer[queueCapacity]; clearQueue();}LoopQueue::~LoopQueue(){ delete[] m_lqueue; m_lqueue = NULL;}bool LoopQueue::queueEmpty()const{ return m_lqueueLen == 0?true:false;}bool LoopQueue::queueFull() const{ return m_lqueueLen == m_lqueueCapacity?true:false;}int LoopQueue::queueLength()const{ return m_lqueueLen;}void LoopQueue::clearQueue(){ m_lqueueLen = 0; m_lqueueHead = 0; m_lqueueTail = 0;}/**由于Customer的成员变量并没有指针类型,所以不用使用使用深拷贝,默认的拷贝构造函数进行值赋值,就可以满足赋值的要求**/bool LoopQueue::enQueue(Customer element){ if(queueFull()) return false; m_lqueue[m_lqueueTail] = element; m_lqueueTail++; m_lqueueTail = m_lqueueTail % m_lqueueCapacity; m_lqueueLen++; return true;}bool LoopQueue::deQueue(Customer &element){ if(queueEmpty()) return false; element = m_lqueue[m_lqueueHead]; m_lqueueHead++; m_lqueueHead = m_lqueueHead % m_lqueueCapacity; m_lqueueLen--; return true;}/**遍历函数注意i循环的起点和终点是极易出错的**/void LoopQueue::queueTraverse(){ cout<<"遍历队列---------------------------------------"<<endl; for(int i = m_lqueueHead;i < m_lqueueLen + m_lqueueHead;i++){ m_lqueue[i%m_lqueueCapacity].printInfo(); } cout<<"遍历结束---------------------------------------"<<endl;}3、创建文件Customer.h
#ifndef CUSTOMER_H#define CUSTOMER_H#include <string>/**注意引入命名空间std这条语句一定要有,否则会提示string数据类型没有定义**/using namespace std;/**使用Object类型作为循环队列的存储对象**/class Customer{public: //在初始化Customer类型的数组时必须有默认的构造参数,也可是使用带参的构造函数但要给出缺省时的默认值 Customer(string name = "",int age = 0); void printInfo();private: string m_strName; int m_iAge;};#endif // CUSTOMER_H4、创建文件Customer.cpp
#include "Customer.h"#include <iostream>using namespace std;Customer::Customer(string name,int age){ m_strName = name; m_iAge = age;}void Customer::printInfo(){ cout<<"姓名"<<m_strName<<endl; cout<<"年龄"<<m_iAge<<endl;}5、在main函数里写入 如代码测试定义的队列是否正确
#include <iostream>#include "MyQueue.h"using namespace std;int main(){ LoopQueue *p = new LoopQueue(4); Customer c1("张三",21);//注意不能使用new,使用new返回的是对象指针赋值时可能会出现问题 Customer c2("李四",22); Customer c3("王五",23); p->enQueue(c1); p->enQueue(c2); p->enQueue(c3); p->queueTraverse(); Customer c4("",0); p->deQueue(c4); c4.printInfo(); p->queueTraverse(); delete p; p = NULL; return 0;}
1 0
- 数据结构基础——循环队列的C++实现
- 数据结构的C实现_循环队列
- 数据结构循环队列的实现c程序
- 数据结构的C实现_循环队列
- 【数据结构】循环队列的实现(c++)
- 数据结构基础(5)--C语言实现循环队列--静态
- 数据结构基础之循环队列C语言实现
- 数据结构与算法分析—循环队列的数组实现(C语言)
- 数据结构——循环队列(c++)
- C语言数据结构——循环队列
- 数据结构基础(7) --循环队列的设计与实现
- 数据结构基础(7) --循环队列的设计与实现
- 数据结构基础(7) --循环队列的设计与实现
- 数据结构之——基于数组实现的循环队列
- 数据结构——循环队列的简单实现
- C# 数据结构基础-实现循环队列
- 数据结构循环队列斐波拉契数列的实现(c语言)
- 数据结构Java实现——②队列--->队列的“奇葩”一循环顺序队列
- 道客web前端开发实习生,电话面试问题
- Java Study 04
- google hacking 常用语句整合
- kali linux 2016.2 live usb persistence 制作
- 华为OJ基础第四题 漂亮的名字
- 数据结构基础——循环队列的C++实现
- Elasticsearch2.x Cluster Health
- Openjudge小学奥数--7834 分成互质组!
- 【第三周】第三章例3_2
- IPMI监控笔记--我的研究生第一实践
- Struts2自学入门(二)
- java.lang.UnsatisfiedLinkError: Couldn't load hyphenate_av from loader dalvik.system.PathClassLoader
- bzoj2152 树形DP
- linux工作队列 - workqueue总览