不牺牲存储单元的循环队列
题目
循环队列中设置一个标志flag,当frontrear且flag0时为队空,当frontrear且flag1时为队满,实现相应的入队和出队算法并验证。
浅析
循环队列的底层是什么?
循环队列的底层是数组,所以我们需要在程序的一开始设置一个常量const用于保存我们的队列的最大容量。
const int QueueSize=5;
传统的循环队列是如何实现的?
传统的循环队列采取浪费最后一个存储空间的方式来进行实现。
核心就是对队列的容量取余数。
代码
ECirQueue.h
/*
*不牺牲尾端空间的循环队列
*特殊的循环队列
*/
#include<iostream>
using namespace std;
const int QueueSize=5;
class ECirQueue
{
private:
/* data */
// int data[QueueSize]; //队列的底层依然为数组
// int front; //队头指针
// int rear; //队尾指针
public:
int data[QueueSize]; //队列的底层依然为数组
int front; //队头指针 假的队头
int rear; //队尾指针
int flag; //标志
ECirQueue();
~ECirQueue();
void EnQueue(int x); //进队
int DeQueue(); //出队,令队头元素出队
int GetHead(); //取队头元素 不删除
bool Empty(); //判断队列是否为空
void PrintQueue(); //遍历输出Queue 排队顺序
};
ECirQueue.cpp
#include"ECirQueue.h"
ECirQueue::ECirQueue()
{
rear=-1;
this->rear=this->front;
flag=0;
}
ECirQueue::~ECirQueue()
{
cout<<"析构"<<endl;
}
void ECirQueue::EnQueue(int x)
{
if(front==rear && flag==1)
{
cout<<"队列已满,无法继续插入元素"<<endl;
return;
}
rear=(rear+1)%QueueSize; //队尾指针 在循环下 后移+1
cout<<"此时的rear="<<rear<<endl;
cout<<"此时的front="<<front<<endl;
cout<<"此时的flag="<<flag<<endl;
cout<<"----------"<<endl;
this->data[rear]=x; //在队尾插入元素
if(rear==front)
{
flag=1;
cout<<"队列此时已满"<<endl;
}
}
int ECirQueue::DeQueue()
{
//判空
if(front==rear && flag==0)
{
cout<<"队列为空,返回-1"<<endl;
return -1;
}
front=(front+1)%QueueSize; //队头指针 在循环下 后移+1
cout<<"此时的rear="<<rear<<endl;
cout<<"此时的front="<<front<<endl;
cout<<"此时的flag="<<flag<<endl;
if(front==rear)
{
cout<<"队列重新变为空"<<endl;
flag=0;
}
return this->data[front]; //返回出队前的队头元素
}
int ECirQueue::GetHead()
{
//判空
if(front==rear && flag==0)
{
cout<<"队列为空,返回-1"<<endl;
return -1;
}
return this->data[(front+1)%QueueSize];
}
void ECirQueue::PrintQueue()
{
//判空
if(front==rear && flag==0)
{
cout<<"队列为空"<<endl;
return;
}
int size=0;
int i=(front+1)%QueueSize;
cout<<"i="<<i<<endl;
cout<<"rear="<<rear<<endl;
size=rear+1;
if(front==rear && flag==1)
{
size=QueueSize;
//i=0;
}
while(i<size)
{
cout<<data[i]<<" ";
i++;
}
cout<<endl;
}
测试
main.cpp
#include"ECirQueue.h"
int main()
{
ECirQueue c1;
c1.PrintQueue();
c1.EnQueue(1);
c1.EnQueue(3);
c1.EnQueue(2);
c1.EnQueue(3);
c1.EnQueue(4);
c1.EnQueue(5);
cout<<"遍历"<<endl;
c1.PrintQueue();
c1.EnQueue(6);
c1.PrintQueue();
cout<<"<<<<<>>>>>"<<endl;
cout<<"队列出队:"<<c1.DeQueue()<<endl;
cout<<"<<<<<>>>>>"<<endl;
cout<<"队列出队:"<<c1.DeQueue()<<endl;
cout<<"<<<<<>>>>>"<<endl;
cout<<"队列出队:"<<c1.DeQueue()<<endl;
cout<<"<<<<<>>>>>"<<endl;
cout<<"队列出队:"<<c1.DeQueue()<<endl;
cout<<"<<<<<>>>>>"<<endl;
cout<<"队列出队:"<<c1.DeQueue()<<endl;
cout<<"~~~~~~~~~~~~~~~~~~~"<<endl;
c1.EnQueue(2);
c1.EnQueue(3);
c1.EnQueue(4);
c1.EnQueue(5);
c1.EnQueue(6);
cout<<"<<<<<>>>>>"<<endl;
cout<<"队列出队:"<<c1.DeQueue()<<endl;
cout<<"<<<<<>>>>>"<<endl;
cout<<"队列出队:"<<c1.DeQueue()<<endl;
cout<<"<<<<<>>>>>"<<endl;
cout<<"队列出队:"<<c1.DeQueue()<<endl;
cout<<"<<<<<>>>>>"<<endl;
cout<<"队列出队:"<<c1.DeQueue()<<endl;
cout<<"<<<<<>>>>>"<<endl;
cout<<"队列出队:"<<c1.DeQueue()<<endl;
system("pause");
return 0;
}