目录
1.队列
栈:只允许在一端进行入栈和出栈操作的线性表;
队列:允许在一端进行入队,另一端进行出队的线性表。
以下只是顺序队列的形式:
我们主要实现循环队列,因为循环队列的实现和顺序队列差不多,但是在判断队空和队满时需要注意。
循环队列判断队空和队满有三种方法:
(1)方法一:上面给出的(本文主要使用这一种)。
(2)方法二:
首先是另外设置一个标志位以区别队列是“空”还是“满”:比如:标志位 int tag=0(出队);tag(入队);
if(tag==1&&q.rear==q.front){
printf("队满");
}
if(tag==0&&q.rear==q.front){
printf("队空");
}
(3)方法二:
使用一个记录元素个数的变量:int size=0;
注:最早进入队列的元素最早出队。其实在操作系统中的作业排队。在允许多道程序运行的计算机系统中,同时有几个作业运行,如果运行的结果都需要通过通道输出,那么就要按请求输出的先后次序排队。每当通道传输完毕可以接收新的输出任务时,队头的作业先从队列中退出作业输出操作。比如还有我们在银行排队时也是队列的形式。
2.队列的相关操作
(1)数据结构定义
#include<stdlib.h>
#include<stdio.h>
#define MAXSIZE 5
typedef int ElemType;
typedef struct Qeueu{
ElemType *data;
int rear,front;
int Maxsize;
}SqQueue;
(2)初始化和重新申请空间
//初始化
void InitSqQueue(SqQueue&q){
q.data=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
if(q.data==NULL){
printf("申请空间失败!\n");
return;
}
q.front=0;
q.rear=0;
q.Maxsize=MAXSIZE;
}
//重新申请空间
void reMalloc(SqQueue&q,int len){
ElemType*newbase=(ElemType*)realloc(q.data,(q.Maxsize+len)*sizeof(ElemType));
q.data=newbase;
q.Maxsize=q.Maxsize+len;
}
void MenuSqQueue(){
printf("--------------1.入队操作---------\n");
printf("--------------2.出队操作---------\n");
printf("--------------3.获取队头元素-----\n");
printf("--------------4.重新初始化-------\n");
printf("--------------5.退出操作---------\n");
}
(3)判断队空,队满和获取队列中的元素个数
//判断队空
bool Empty(SqQueue q){
if(q.front==q.rear){
return true;
}else{
return false;
}
}
//判断队满
bool Full(SqQueue q){
if((q.rear+1)%q.Maxsize==q.front){
return true;
}else{
return false;
}
}
//队中元素
int QueueLength(SqQueue q){
int size=(q.rear-q.front+q.Maxsize)%q.Maxsize;
return size;
}
(4)入队,出队和获取队头元素
//入队
void QueuePush(SqQueue&q,ElemType e){
if(Full(q)){
printf("队已满!\n");
printf("请输入申请空间大小: ");
int len=0;
scanf("%d",&len);
reMalloc(q,len);
printf("当前空间大小: %d\n",q.Maxsize);
return;
}
q.data[q.rear]=e;
q.rear=(q.rear+1)%q.Maxsize;
printf("插入元素成功!\n");
}
//出队
void QueueDe(SqQueue&q,ElemType&e,int&mask){
if(Empty(q)){
printf("队已空!\n");
mask=0;
return;
}
e=q.data[q.front];
q.front=(q.front+1)%q.Maxsize;
}
//获取队头元素
void GetQueueHead(SqQueue q,ElemType&e,int&mask){
if(Empty(q)){
printf("队已空!\n");
mask=0;
return;
}
e=q.data[q.front];
}
(5)主函数
int main(){
SqQueue q;
ElemType e;
int flag=0;
InitSqQueue(q);
int mask=1;
while(1){
MenuSqQueue();
printf("请输入操作: ");
scanf("%d",&flag);
switch(flag){
case 1:
printf("请输入元素(-1_end): ");
scanf("%d",&e);
while(e!=-1){
QueuePush(q,e);
printf("请输入元素(-1_end): ");
scanf("%d",&e);
}
break;
case 2:
QueueDe(q,e,mask);
if(mask!=0){
printf("出栈元素 = %d\n",e);
}
break;
case 3:
GetQueueHead(q,e,mask);
if(mask!=0){
printf("获取元素 = %d\n",e);
}
break;
case 4:
InitSqQueue(q);
printf("初始化成功!\n");
break;
default:
free(q.data);
printf("操作结束!\n");
}
if(flag==5){
break;
}
}
return 0;
}
(6)测试