本人原创,有问题请评论,楼主会随时回来查看修改滴~
觉得有用请点个赞哦~~
1、顺序队
/**
2020.04:queue
顺序结构-循环队列
判空
判满
求长度
入队
出队
获取队头
获取队尾
*/
#include<bits/stdc++.h>
using namespace std;
#define QUEUESIZE 100
typedef int DataType;
typedef struct SeqQueue
{
DataType data[QUEUESIZE];
int front;
int rear;
} SeqQueue;
void initQueue(SeqQueue *q)//初始化queue
{
q->front = 0;//前部
q->rear = 0;//尾部
}
void clearQueue(SeqQueue *q)//清空queue
{
q->front = 0;
q->rear = 0;
}
bool queueEmpty(SeqQueue *q)//isEmpty?
{
return q->front == q->rear;
}
bool queueFull(SeqQueue *q)//isFull?
{
return q->front == (q->rear+1)%QUEUESIZE;
}
DataType getHead(SeqQueue *q)//return Head
{
DataType temp;
if(queueEmpty(q))
{
return -1;
}
temp = q->data[q->front];//返回队头
return temp;
}
DataType getTail(SeqQueue *q)//return tail
{
DataType temp;
if(queueEmpty(q))
{
return -1;
}
temp = q->data[q->rear-1];//返回队尾
return temp;
}
DataType deQueue(SeqQueue *q)//出队
{
DataType temp;
if(queueEmpty(q))
return -1;
temp = q->data[q->front];
q->front = (q->front+1) % QUEUESIZE;//形成循环序列,几何上相当于front--
return temp;
}
bool enQueue(SeqQueue *q,DataType e)//入队
{
if(queueFull(q))
return false;
q->data[q->rear]=e;
q->rear=(q->rear+1)%QUEUESIZE;//形成循环序列,几何上相当于rear++
return true;
}
int queueLength(SeqQueue *q)
{
return (q->rear - q->front + QUEUESIZE) %QUEUESIZE;//等同于QUEUESIZE-|front-rear|
}
int Random_number()//随机产生0~222整数
{
return rand()%222;
}
int main()
{
srand(time(NULL)); //根据电脑时间,生成随机种子
SeqQueue sq;
cout<<"1--程序正在执行队列初始化...."<<endl;
initQueue(&sq);
cout<<" 初始化成功,正在入队20个随机元素"<<endl;
cout<<" 入队顺序:";
for(int i = 1; i<21; i++)
{
int temp_num=Random_number();
printf("%5d",temp_num);
enQueue(&sq,temp_num);
if(i%10==0)
cout<<endl<<" ";
}
cout<<endl<<" 20个元素已成功入队!"<<endl<<endl;
cout<<"2--程序正在执行入队....请输入一个正整数元素:";
int temp_en;
cin>>temp_en;
if(enQueue(&sq,temp_en))
cout<<" 入队成功!"<<endl<<endl;
else
cout<<" 入队失败!"<<endl<<endl;
cout<<"3--程序正在判空...."<<endl;
if(queueEmpty(&sq))
cout<<" queue is empty"<<endl<<endl;
else
cout<<" queue is not empty"<<endl<<endl;
cout<<"4--程序正在判满...."<<endl;
if(queueEmpty(&sq))
cout<<" queue is full"<<endl<<endl;
else
cout<<" queue is not full"<<endl<<endl;
cout<<"5--程序正在获取长度...."<<endl;
cout<<" 获取长度为:"<<queueLength(&sq)<<endl<<endl;
cout<<"6--程序正在执行出队...."<<endl;
int temp_de=deQueue(&sq);
if(temp_de!=-1)
cout<<" 出队元素为:"<<temp_de<<endl<<endl;
else
cout<<" 入队失败!"<<endl<<endl;
cout<<"7--程序正在获取长度...."<<endl;
cout<<" 获取长度为:"<<queueLength(&sq)<<endl<<endl;
cout<<"8--程序正在获得队头元素...."<<endl;
int temp_gh=getHead(&sq);
if(temp_gh!=-1)
cout<<" 队头元素为:"<<temp_gh<<endl<<endl;
else
cout<<" 获取失败!"<<endl<<endl;
cout<<"9--程序正在获得队尾元素...."<<endl;
int temp_gt=getTail(&sq);
if(temp_gt!=-1)
cout<<" 队尾元素为:"<<temp_gt<<endl<<endl;
else
cout<<" 获取失败!"<<endl<<endl;
}
2、链式队
/**
2020.04:queue
链式结构-队列
判空
求长度
入队
出队
获取队头
获取队尾
*/
#include<bits/stdc++.h>
using namespace std;
typedef int DataType;
typedef struct QNode
{
DataType data;
struct QNode *next;
} QNode;
typedef struct LinkQueue
{
QNode *front,*rear;
int count;
} LinkQueue;
bool queueEmpty(LinkQueue *q) //isEmpty?
{
return q->front == NULL; //队头为空?
}
void clearQueue(LinkQueue *q) //清空queue
{
QNode *p = q->front;
while(p) //p不为空时
{
QNode *p1 = p; //定义p1,让其指向p当前指向的结点
p=p->next; //p指向下一个结点
free(p1); //释放掉p1指向的结点
}
}
void initQueue(LinkQueue *q) //初始化queue
{
if(queueEmpty(q)==false) //防止初始化一个已经有结点的队列,产生崩溃
clearQueue(q);
else
{
q->front = NULL;
q->rear = NULL;
q->count = 0;
}
}
DataType getHead(LinkQueue *q) //return Head
{
DataType temp;
if(queueEmpty(q))
{
return -1;
}
temp = q->front->data;
return temp;
}
DataType getTail(LinkQueue *q) //return tail
{
DataType temp;
if(queueEmpty(q))
{
return -1;
}
temp = q->rear->data; //返回队尾
return temp;
}
DataType deQueue(LinkQueue *q) //出队
{
DataType temp;
if(queueEmpty(q))
return -1;
QNode *p = q->front; //队头元素
temp = q->front->data; //获取数据
q->front=q->front->next;//队头后u移
free(p);
q->count--; //长度-1
return temp;
}
bool enQueue(LinkQueue *q,DataType e)//入队
{
QNode *p = new QNode;
p->data = e;
p->next = NULL;
if(queueEmpty(q))
{
q->front = p; //令头尾都指向p
q->rear = p;
}
else
{
q->rear->next=p; //尾结点指向p,之后p为队尾结点
q->rear=p; //q->rear为flag,为p结点
}
q->count++;
return true;
}
int queueLength(LinkQueue *q)
{
return q->count;
}
int Random_number() //随机产生0~222整数
{
return rand()%222;
}
int main()
{
srand(time(NULL)); //根据电脑时间,生成随机种子
LinkQueue lq;
lq.front=NULL;//指向空,防止初始化中,判空时对野指针操作(free(p1);语句处)
cout<<"1--程序正在执行队列初始化...."<<endl;
initQueue(&lq);
cout<<" 初始化成功,正在入队20个随机元素"<<endl;
cout<<" 入队顺序:";
for(int i = 1; i<21; i++)
{
int temp_num=Random_number();
if(i!=20)
printf("%5d ->",temp_num);
else
printf("%5d ",temp_num);
enQueue(&lq,temp_num);
if(i%10==0)
cout<<endl<<" ";
}
cout<<endl<<" 20个元素已成功入队!"<<endl<<endl;
cout<<"2--程序正在执行入队....请输入一个正整数元素:";
int temp_en;
cin>>temp_en;
if(enQueue(&lq,temp_en))
cout<<" 入队成功!"<<endl<<endl;
else
cout<<" 入队失败!"<<endl<<endl;
cout<<"3--程序正在判空...."<<endl;
if(queueEmpty(&lq))
cout<<" queue is empty"<<endl<<endl;
else
cout<<" queue is not empty"<<endl<<endl;
cout<<"4--程序正在获取长度...."<<endl;
cout<<" 获取长度为:"<<queueLength(&lq)<<endl<<endl;
cout<<"5--程序正在执行出队...."<<endl;
int temp_de=deQueue(&lq);
if(temp_de!=-1)
cout<<" 出队元素为:"<<temp_de<<endl<<endl;
else
cout<<" 入队失败!"<<endl<<endl;
cout<<"6--程序正在获取长度...."<<endl;
cout<<" 获取长度为:"<<queueLength(&lq)<<endl<<endl;
cout<<"7--程序正在获得队头元素...."<<endl;
int temp_gh=getHead(&lq);
if(temp_gh!=-1)
cout<<" 队头元素为:"<<temp_gh<<endl<<endl;
else
cout<<" 获取失败!"<<endl<<endl;
cout<<"8--程序正在获得队尾元素...."<<endl;
int temp_gt=getTail(&lq);
if(temp_gt!=-1)
cout<<" 队尾元素为:"<<temp_gt<<endl<<endl;
else
cout<<" 获取失败!"<<endl<<endl;
}
复杂度分析
时间复杂度: (注:单个元素操作)
循环顺序队入队O(1) 循环顺序队出队O(1)
链式队入队O(1) 链式队出队O(1)
获取顶端元素O(1) 判满/空O(1)
空间复杂度:
循环顺序队入队O(1) 循环顺序队出队O(1)
链式队入队O(1) 链式队出队O(1)
获取顶端元素O(1) 判满/空O(1)