数据结构之队列
来源:互联网 发布:我的世界手机版月球js 编辑:程序博客网 时间:2024/05/29 15:05
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列特性:先进先出(FIFO)——先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。
队列有下面几个操作:
- InitQueue() ——初始化队列
- EnQueue() ——进队列
- DeQueue() ——出队列
- IsQueueEmpty()——判断队列是否为空
- IsQueueFull() ——判断队列是否已满
//// Header.h// 队列//// Created by mouweng on 17/3/19.// Copyright © 2017年 队列. All rights reserved.//#ifndef Header_h#define Header_h#include<iostream>using namespace std;class MyQueue{public: MyQueue(int QueueCapacity);//创建队列 virtual ~MyQueue(); //销毁队列 void ClearQueue(); //清空队列 bool QueueEmpty() const; //判空队列 bool QueueFull() const; //判断为满 int QueueLength() const; //返回队列长度 bool EnQueue(int element); //新队列入队 bool DeQueue(int &element);//首元素出队 void QueueTraverse(); //遍历队列private: int *m_pQueue; //队列数组指针 int m_iQueueLength; //队列元素个数 int m_iQueueCapacity; //队列数组容量 int m_iHead; int m_iTail;};#endif /* Header_h */
我们所知道,队列可以是直行也可以是环形,之所以把队列设成环形的原因呢,是可以节省内存空间。
下面分别给出两种队列的代码
直行队列源码如下:
//// Header.h// 直行队列//// Created by mouweng on 17/3/20.// Copyright © 2017年 直行队列. All rights reserved.//#ifndef Header_h#define Header_h#include<iostream>using namespace std;class MyQueue{public: MyQueue(int QueueCapacity);//创建队列 virtual ~MyQueue(); //销毁队列 void ClearQueue(); //清空队列 bool QueueEmpty() const; //判空队列 bool QueueFull() const; //判断为满 int QueueLength() const; //返回队列长度 bool EnQueue(int element); //新队列入队 bool DeQueue(int &element);//首元素出队 void QueueTraverse(); //遍历队列private: int *m_pQueue; //队列数组指针 int m_iQueueLength; //队列元素个数 int m_iQueueCapacity; //队列数组容量 int m_iHead; int m_iTail;};#endif /* Header_h */
//// main.cpp// 直行队列//// Created by mouweng on 17/3/20.// Copyright © 2017年 直行队列. All rights reserved.//#include <iostream>using namespace std;#include "Header.h"MyQueue::MyQueue(int QueueCapacity){ m_iQueueCapacity= QueueCapacity; m_iHead=0; m_iTail=0; m_iQueueLength=0; m_pQueue=new int[m_iQueueCapacity];}MyQueue::~MyQueue(){ delete [] m_pQueue; m_pQueue=NULL;}void MyQueue::ClearQueue(){ m_iHead=0; m_iTail=0; m_iQueueLength=0;}bool MyQueue::QueueEmpty() const{ if(m_iQueueLength==0) return true; else return false;}bool MyQueue::QueueFull() const{ if(m_iQueueLength==m_iQueueCapacity) return true; else return false;}int MyQueue::QueueLength() const{ return m_iQueueLength;}bool MyQueue::EnQueue(int element){ if(QueueFull()) { return false; } else { m_pQueue[m_iTail]=element; m_iTail++; m_iQueueLength++; return true; } }bool MyQueue::DeQueue(int &element){ if(QueueEmpty()) { return false; } else { element = m_pQueue[m_iHead]; m_iHead++; m_iQueueLength--; return true; }}void MyQueue::QueueTraverse(){ cout<<endl; for(int i=m_iHead;i<m_iTail;i++) { cout<<m_pQueue[i]<<endl; } cout<<endl;}int main(int argc, const char * argv[]){ MyQueue *p=new MyQueue(10); p->EnQueue(10); p->EnQueue(12); p->EnQueue(16); p->EnQueue(18); p->EnQueue(20); p->QueueTraverse(); int e=0; p->DeQueue(e); cout<<e<<endl; p->DeQueue(e); cout<<e<<endl; p->EnQueue(21); p->EnQueue(22); p->QueueTraverse(); cout<<endl; p->ClearQueue(); p->QueueTraverse(); p->EnQueue(20); p->EnQueue(30); p->QueueTraverse(); delete p; p=NULL; return 0;}
环形队列源码如下:
//// main.cpp// 环形队列//// Created by Anthony on 17/3/19.// Copyright © 2017年 队列. All rights reserved.//#include <iostream>using namespace std;#include "Header.h"MyQueue::MyQueue(int QueueCapacity){ m_iQueueCapacity= QueueCapacity; m_iHead=0; m_iTail=0; m_iQueueLength=0; m_pQueue=new int[m_iQueueCapacity];}MyQueue::~MyQueue(){ delete [] m_pQueue; m_pQueue=NULL;}void MyQueue::ClearQueue(){ m_iHead=0; m_iTail=0; m_iQueueLength=0;}bool MyQueue::QueueEmpty() const{ if(m_iQueueLength==0) return true; else return false;}bool MyQueue::QueueFull() const{ if(m_iQueueLength==m_iQueueCapacity) return true; else return false;}int MyQueue::QueueLength() const{ return m_iQueueLength;}bool MyQueue::EnQueue(int element){ if(QueueFull()) { return false; } else { m_pQueue[m_iTail]=element; m_iTail++; m_iTail=m_iTail%m_iQueueCapacity;//因为是一个环形队列 m_iQueueLength++; return true; }}bool MyQueue::DeQueue(int &element){ if(QueueEmpty()) { return false; } else { element = m_pQueue[m_iHead]; m_iHead++; m_iHead=m_iHead%m_iQueueCapacity;//因为是一个环形队列 m_iQueueLength--; return true; }}void MyQueue::QueueTraverse(){ cout<<endl; for(int i=m_iHead;i<m_iHead+m_iQueueLength;i++) { cout<<m_pQueue[i%m_iQueueCapacity]<<endl; } cout<<endl;}int main(int argc, const char * argv[]){ MyQueue *p=new MyQueue(4); p->EnQueue(10); p->EnQueue(12); p->EnQueue(16); p->EnQueue(18); p->EnQueue(20); p->QueueTraverse(); int e=0; p->DeQueue(e); cout<<e<<endl; p->DeQueue(e); cout<<e<<endl; p->EnQueue(20); p->EnQueue(22); p->QueueTraverse(); cout<<endl; p->ClearQueue(); p->QueueTraverse(); p->EnQueue(20); p->EnQueue(30); delete p; p=NULL; return 0;}
接下来继续给大家延时更加灵活更加节省空间的队列实现方式,是通过链表来粗存队列的元素,为链表队列。
//// Header.h// 链表队列//// Created by mouweng on 17/3/20.// Copyright © 2017年 链表队列. All rights reserved.//#ifndef Header_h#define Header_h#include<iostream>using namespace std;class MyQueue{public: MyQueue();//创建队列 virtual ~MyQueue(); //销毁队列 void ClearQueue(); //清空队列 bool QueueEmpty() const; //判空队列 int QueueLength() const; //返回队列长度 bool EnQueue(int element); //新队列入队 bool DeQueue();//首元素出队 void QueueTraverse(); //遍历队列private: class Node { public: int data; Node *next; void PrintData() { cout<<data<<endl; } }; Node *m_pQueue; //队列数组指针 int m_iQueueLength; //队列元素个数 int m_iHead; int m_iTail;};#endif /* Header_h */
//// main.cpp// 链表队列//// Created by mouweng on 17/3/20.// Copyright © 2017年 链表队列. All rights reserved.//#include <iostream>using namespace std;#include "Header.h"MyQueue::MyQueue(){ m_iHead=0; m_iTail=0; m_iQueueLength=0; m_pQueue=new Node; m_pQueue->data=0; m_pQueue->next=NULL;}MyQueue::~MyQueue(){ ClearQueue(); delete m_pQueue;}void MyQueue::ClearQueue(){ m_iHead=0; m_iTail=0; m_iQueueLength=0; Node *currentNode=m_pQueue->next; while(currentNode!=NULL) { Node *temp=currentNode->next; delete currentNode; currentNode= temp; } m_pQueue->next=NULL;}bool MyQueue::QueueEmpty() const{ if(m_iQueueLength==0) return true; else return false;}int MyQueue::QueueLength() const{ return m_iQueueLength;}bool MyQueue::EnQueue(int element){ Node *temp=m_pQueue; Node *currentNode= new Node; if(currentNode==NULL) return false; currentNode->data=element; while(temp->next!=NULL) temp=temp->next; currentNode->next=temp->next; temp->next=currentNode; m_iQueueLength++; return true;}bool MyQueue::DeQueue(){ if(QueueEmpty()) { return false; } else { Node *temp=m_pQueue; for(int i=0;i<m_iQueueLength-1;i++) temp=temp->next; Node *aftertemp=temp->next; temp->next=aftertemp->next; delete aftertemp; m_iQueueLength--; return true; }}void MyQueue::QueueTraverse(){ cout<<endl; Node *temp=m_pQueue;while(temp->next!=NULL){ temp=temp->next; temp->PrintData();} cout<<endl;}int main(int argc, const char * argv[]){ MyQueue *p=new MyQueue(); p->EnQueue(10); p->EnQueue(12); p->EnQueue(16); p->EnQueue(18); p->EnQueue(20); p->QueueTraverse(); p->QueueLength(); p->DeQueue(); p->DeQueue(); p->QueueTraverse(); p->EnQueue(21); p->EnQueue(22); p->QueueTraverse(); cout<<endl; p->ClearQueue(); p->QueueTraverse(); p->EnQueue(20); p->EnQueue(30); p->QueueTraverse(); delete p; p=NULL; return 0;}
0 0
- 数据结构之队列(链式队列)
- 数据结构之队列(数组队列)
- 数据结构之队列-顺序队列
- 数据结构之循环队列
- 数据结构之顺序队列
- 数据结构之链队列
- java数据结构之队列
- 数据结构之队列
- 数据结构复习之【队列】
- 内核数据结构之队列
- 数据结构之队列实例
- 数据结构学习之队列
- 复习数据结构之队列
- C 队列之数据结构
- 基础数据结构之队列
- 数据结构之队列
- 大话数据结构之队列
- 数据结构之循环队列
- 认认真真写安卓,服务篇,组件(Service)
- 抽象类与接口的区别
- android学习笔记
- 项目架构开发:服务层
- (1)ARM40-A5板应用程序——hello world
- 数据结构之队列
- 103:Fraction to Recurring Decimal
- strncmp函数
- 论文排版:Word加入脚注后,分栏的正文就跑到下一页上去了的解决方案
- Java 浮点数 float和double类型的表示范围和精度
- MIT_线性代数笔记_03_乘法和逆矩阵
- 一个整数可以由其他若干个连续整数的和表示(java)
- EJB的优势和使用场景
- 104:Factorial Trailing Zeroes