//严蔚敏《数据结构》
//队列的顺序表示和实现——循环队列(循环队列是队列的顺序表示)
//自学中,加油!!!
#include<iostream>
using namespace std;
const int MaxQSize=5;
#define QElemType double
typedef struct
{
QElemType* base;
int head,tail;
}SqQueue;
bool Init_SqQueue(SqQueue& Q)//初始化顺序队列(循环队列),因为顺序,所以需要循环
{
Q.base=new QElemType;
if(!Q.base)
return false;
Q.head=Q.tail=0;
return true;
}
bool Input_SqQueue(SqQueue& Q)//向循环队列输入数据
{
QElemType num;
cout<<"输入数据 非double停止\n";
while(cin>>num){
if((Q.tail+1)%MaxQSize==Q.head){
cout<<"队列空间已满\n";
break;
}
Q.base[Q.tail++]=num;
}
return true;
}
void OutPut_SqQueue(SqQueue Q)//遍历输出循环队列
{
cout<<"队列数据:\n";
for(int i=Q.head;i<Q.tail;i++){
cout<<Q.base[i]<<' ';
}
cout<<"\n------\n";
}
bool Clear_SqQueue(SqQueue& Q)//"清空"队列,空队列的定义:队列为空<->Q.head==Q.tail,这个清空并不是实际意义上的清空
//和顺序栈的清空类似,清空后原数据仍存在,只不过不能通过Q.head Q.tail 输出数据了
//Q.base的空间由Q.base开辟,需要free(Q.base),这个功能放在Destroy中
{
Q.tail=Q.head;
return true;
}
bool Destroy_SqQueue(SqQueue& Q)//破坏掉队列,不单单是释放Q.base指向的内存
{
Clear_SqQueue(Q);
free(Q.base);
Q.base=nullptr;//bug1
Q.head=Q.tail=0;
return true;
}
int Length_SqQueue(SqQueue Q)//返回循环队列的长度
{
return (Q.tail-Q.head+MaxQSize)%MaxQSize;
}
bool Insert_SqQueue(SqQueue& Q,QElemType e)//插入e到循环队列队尾
{
if((Q.tail+1)%MaxQSize==Q.head)
return false;
Q.base[Q.tail]=e;//bug2:不应该 Q.base[Q.tail++]=e
Q.tail=(Q.tail+1)%MaxQSize;
return true;
}
bool Delete_SqQueue(SqQueue& Q,QElemType& e)//删除循环队列的队头数据,并用e存储
{
if(Q.head==Q.tail)
return false;
e=Q.base[Q.head];//bug3:不应该 e=Q.base[Q.head++]
Q.head=(Q.head+1)%MaxQSize;
return true;
}
int main()
{
SqQueue Q;
Init_SqQueue(Q);
Input_SqQueue(Q);
OutPut_SqQueue(Q);
cout<<"队列长度:"<<Length_SqQueue(Q)<<endl;
QElemType e;
Delete_SqQueue(Q,e);
OutPut_SqQueue(Q);
Insert_SqQueue(Q,e);
OutPut_SqQueue(Q);
Clear_SqQueue(Q);
cout<<"”清空“后:\n";
cout<<"其中的两个数据:"<<Q.base[0]<<" "<<Q.base[1]<<endl;
OutPut_SqQueue(Q);
cout<<"实际上证明原数据仍存在,只不过不能通过Q.head Q.tail找到了\n";
Destroy_SqQueue(Q);
cout<<"其中的两个数据:"<<Q.base[0]<<" "<<Q.base[1]<<endl;//Destroy后Q.base错误
cout<<"证明原数据已经不存在了\n";
return 0;
}
输入数据 非double停止
1.1
2.2
3.3
4.4
5.5
队列空间已满
队列数据:
1.1 2.2 3.3 4.4
-- -- --
队列长度: 4
队列数据:
2.2 3.3 4.4
-- -- --
队列数据:
-- -- --
”清空“后:
其中的两个数据: 1.1 2.2
队列数据:
-- -- --
实际上证明原数据仍存在,只不过不能通过Q . head Q . tail找到了
Process returned - 1073741819 ( 0xC0000005 ) execution time : 6.445 s
Press any key to continue .