循环队列:
#include <iostream>
using namespace std;
const int MAX_SIZE = 100;
template <class DataType>
/*
循环队列可以想象成一个环形,里面有一个个的格子,也就是环形数组
front表示首个(但是这不会一直是0),rear表示尾部
需要的函数是:
构造函数:设置private里面的数据(数组【首指针】,front,rear【下标】,mSize数组的大小析构函数:释放内存,删除data
把元素放进去的函数
放出来的函数【这两个函数需要判断是否为空,或者是否为满的函数】
清空的函数
显示的函数
显示现在队列里面的现有元素的个数
*/
class CirQueue
{
private:DataType *data; //指向队列存储空间int front; //队首下标int rear; //队尾下标int mSize; // 存放队列的数组的大小
public:CirQueue(); //建立缺省长度的队列CirQueue(int s); //建立长度为size的队列~CirQueue(); //清空队列,释放内存bool enQueue(DataType& item); //入队bool deQueue(); //出队DataType getFront(); //读取队头元素,但不删除bool isEmpty(); //判断队列是否为空bool isFull(); //判断队列是否为满void clearQueue(); //清空队列void displayQueue(); //显示队列内容int queueLength(); //获取队列元素个数
};
template <class DataType>
CirQueue<DataType>::CirQueue()
{front=0;rear=0;mSize=MAX_SIZE;data= new DataType[mSize];
}
template <class DataType>
CirQueue<DataType>::CirQueue(int s)
{front=0;rear=0;mSize=s+1;data= new DataType[mSize];
}
template <class DataType>
CirQueue<DataType>::~CirQueue()
{delete[] data;
}
template <class DataType>bool CirQueue<DataType>::enQueue(DataType& item)
{if(CirQueue::isFull()){return false;}data[rear]=item;//从尾部加数据,就是data【front】是有数据的,data[rear]是没有数据的rear=(rear+1)%mSize;return true;}
template <class DataType>bool CirQueue<DataType>::deQueue(){if(CirQueue::isEmpty()){return false;}front=(front+1)%mSize;//把元素放出来的就是front向前移(%msize是因为环形)return true;}template <class DataType>bool CirQueue<DataType>::isEmpty(){return front==rear;//空的情况下front==rear}template <class DataType>bool CirQueue<DataType>::isFull(){return (rear+1)%mSize==front;//满了的话,rear+1=front,rear处没有数据,但是没有大碍}template <class DataType>DataType CirQueue<DataType>::getFront(){DataType x;x=data[front];return x;}template <class DataType>void CirQueue<DataType>::clearQueue(){front=rear;}template <class DataType> //清空队列
void CirQueue<DataType>::displayQueue()
{if(CirQueue<DataType>::isEmpty()){cout<<"队列为空"<<endl;}else{for(int i=front;i!=rear;i=(i+1)%mSize){cout<<data[i]<<" ";}cout<<endl;}}
template <class DataType> //显示队列内容
int CirQueue<DataType>::queueLength()
{int len=(rear-front+mSize)%mSize;return len;
}int main()
{int number;CirQueue<int> lq(20);cout << "将1-10加入队列" << endl;for(int i=1; i<=10; i++){if(!lq.enQueue(i))cout<<"队列已满,无法入队\n";}lq.displayQueue();//打印队列cout<<"弹出6个元素"<< endl;for(int i=0; i<6; i++){if(!lq.deQueue())cout<<"队列为空,无法出列。\n";}lq.displayQueue();//打印队列cout << "将11-21加入队列" << endl;for(int i=11; i<=21; i++){if(!lq.enQueue(i))cout<<"队列已满,无法入队\n";}lq.displayQueue();cout << "将22-28加入队列" << endl;for(int i=22; i<=28; i++){if(!lq.enQueue(i))cout<<"队列已满,无法入队\n";}lq.displayQueue();cout<<"队首元素是:"<<lq.getFront()<<endl;cout<<"弹出20个元素"<< endl;for(int i=0; i<20; i++){lq.deQueue();}lq.displayQueue();return 0;
}
链表队列:
实际上就是简单的链表加上class类别的表示形式
/*链式队列*/
#include<stdlib.h>
#include<iostream>
using namespace std;
template<class DataType>
/**链队的结点*/
struct Node
{DataType data;struct Node *next;
};
template <class DataType>
class LinkQueue
{
private:Node<DataType> *front, *rear; //队列的头和尾int length; //队列元素个数
public:LinkQueue(); //建立头结点,初始化属性~LinkQueue(); //释放队列空间void enQueue(DataType x); //入队bool deQueue();//出队DataType getFront( );//获取队头元素bool isEmpty(); //判断队列是否为空void clearQueue(); //清空队列void displayQueue(); //显示队列内容int queueLength(); //获取队列元素个数
};
template <class DataType>
LinkQueue<DataType>::LinkQueue()
{front=rear=NULL;length=0;
}
template <class DataType>LinkQueue<DataType>::~LinkQueue(){}template <class DataType> //释放void LinkQueue<DataType>::enQueue(DataType x){/*使用链表的话如果要加元素的话首先创立一个新的结构体,然后再去赋值,再去改变next指针*/Node<DataType> *newnode= new Node<DataType>;newnode->data=x;newnode->next=NULL;if(front==NULL)//这里不是rear=NULL{front=newnode;rear=newnode;/*如果front和rear指在一起时,也就是链表为空的情况,这种情况要分开讨论。*/}else{rear->next=newnode;rear=newnode;}}template <class DataType>bool LinkQueue<DataType>::deQueue(){if(LinkQueue<DataType>::isEmpty()){return false;}else{Node<DataType> *temp=front;front=front->next;//除去元素:将front指针向后移delete temp;length--;return true;}}template <class DataType>DataType LinkQueue<DataType>::getFront( ){return front->data;}template <class DataType>bool LinkQueue<DataType>::isEmpty(){return front==NULL;}template <class DataType> //判断队列是否为空void LinkQueue<DataType>::clearQueue(){front=NULL;}template <class DataType> //清空队列void LinkQueue<DataType>::displayQueue(){if(LinkQueue<DataType>::isEmpty()){cout<<"[0] 队列为空。"<<endl;;}else{int len=LinkQueue<DataType>::queueLength();cout<<"["<<len<<"] ";Node<DataType> *temp=front;while(temp!=NULL){cout<<temp->data<<" ";temp=temp->next;}cout<<endl;}}template <class DataType>int LinkQueue<DataType>::queueLength(){if(LinkQueue<DataType>::isEmpty()){return 0;}else{int len=0;Node<DataType> *temp=front;while(temp!=NULL){len++;temp=temp->next;}return len;//可以这样循环来得到长度,也可以在加入元素和除去元素的函数里面len++和len--}}int main()
{int number;LinkQueue<int> lq;cout<<"1-10入队:\n";for(int i=1; i<=10; i++){lq.enQueue(i);}lq.displayQueue();cout<<"队首元素是:"<<lq.getFront()<<endl;cout<<"连续出队11个整数\n";for(int i=0; i<11; i++){if(!lq.isEmpty()){cout<<lq.getFront()<<"出队"<<endl;lq.deQueue();}else{cout<<"队列为空,无法出队。"<<endl;}}lq.displayQueue();cout<<"10-16入队\n";for(int i=10; i<=16; i++){lq.enQueue(i);}
lq.displayQueue();//创建一个字符串队列cout<<"压入三个字符串到队列:\n";LinkQueue<string> strQueue;strQueue.enQueue("Hello");strQueue.enQueue("Wold");strQueue.enQueue("C++");strQueue.displayQueue();cout<<"清空队列\n";strQueue.clearQueue();strQueue.displayQueue();return 0;
}