队列
队列,也是顺序存储结构,其基本操作:增删改查,判空,判满操作
1.初始化
#include<stdio.h>
#define Maxsize 10 //栈中最大元素个数
typedef struct{
ElemType data[Maxsize]; //静态数组存放队列元素
int front,rear; //队头指针和队尾指针
}SqQueue;
void InitQueue(SqQueue &Q){
//初始化 队头队尾指针指向0
Q.front=Q.rear=0;
}
void testQueue{
Queue Q; //声明一个队列,为其分配空间
//后续操作
InitStack(Q);
}
2.判空操作(队头指针等于队尾指针)
bool QueueEmpty(SqQueue Q){
if(Q.front==Q.rear)
return true; //队空
else
return false;
}
3.入队操作
bool EnQueue(SqQueue &Q,ElemType x){
if((Q.rear+1)%MaxSize==Q.front) //判断队满 并不是 Q.rear==Q.front ,必须牺牲一个单元
return false;
Q.data[Q.rear]=x; //将x插入队尾
Q.rear=(Q.rear+1)%Maxsize; //队尾指针后移
return true;
}
4.出队操作
bool DeQueue(SqQueue &Q,ElemType &x){
if(Q.rear==Q.front)
return false; //队空报错
x=Q.data[Q.front]; //取出删除的值
Q.front=(Q.front+1)%Maxsize; //队头指针改变
return true;
}
出队入队操作指针的变化一样
Q.rear=(Q.rear+1)%Maxsize
Q.front=(Q.front+1)%Maxsize
5.获得队头元素的值
bool GetHead(SqQueue &Q,ElemType &x){
if(Q.rear==Q.front)
return false; //队空报错
x=Q.data[Q.front]; //直接输出队头元素的值
return true;
}
如果不牺牲一个空间 怎么办呢??
方法二
用size记录队列当前的长度, 初始化时size=0;
插入成功 size++
删除成功size–
size=Maxsize 为队满
size=0 为队空
typedef struct{
ElemType data[Maxsize]; //静态数组存放队列元素
int front,rear; //队头指针和队尾指针
int size; //队列当前长度
}SqQueue;
方法三
在结构体中放入一个tag来进行记录最近是删除和插入,如
每次删除成功时,令tag=0;
每次插入成功时,令tag=1;
判断队满是:if(Q.frontQ.rear &&tag1)
判断队空是:if(Q.frontQ.rear &&tag====0)
typedef struct{
ElemType data[Maxsize]; //静态数组存放队列元素
int front,rear; //队头指针和队尾指针
int tag; //最近是删除或插入
}SqQueue;
6.判断队列中元素个数
队列元素个数=(rear+MaxSize-front)%MaxSize
还有一个:如果rear指针指向的是尾元素的时候,则入队的时候是
Q.rear=(Q.rear+1)%Maxsize;
Q.data[Q.rear]=x;
此时初始指针为
判队空:(Q.rear+1)%Maxsize==Q.front;
判队满:
牺牲个存储单元或增加辅助变量