#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define MaxSize 10
typedef struct {
char name[20];
}ElemType;
typedef struct {
ElemType data[MaxSize];
int front,rear;
// int size; 这种方法可以不浪费那个多出来的空间,不过却多了一个size变量,差不太多。为空size=0,为满size=Maxsize
// bool tag; tag为true,则表示最近进行了一次删除操作,为false,则表示最近进行了一次增加操作。队空时tag一定为true
}SqQueue;
void InitQueue(SqQueue *Q);
bool QueueEmpty(SqQueue *Q);
bool EnQueue(SqQueue *Q,ElemType x);
bool DeQueue(SqQueue *Q,ElemType *x);
bool GetHead(SqQueue *Q,ElemType *x);
int GetSize(SqQueue *Q);
int main(){
ElemType a={"aaa"},b={"bbb"},c={"ccc"};
SqQueue *Q = (SqQueue *) malloc(sizeof(SqQueue));
InitQueue(Q);
QueueEmpty(Q);
EnQueue(Q,a);
EnQueue(Q,b);
int d=GetSize(Q);
GetHead(Q,&c);
DeQueue(Q, &c);
return 0;
}
void InitQueue(SqQueue *Q) {
Q->rear=Q->front=0;
}
bool QueueEmpty(SqQueue *Q) {
if(Q->rear==Q->front)
return true;
else
return false;
}
bool EnQueue(SqQueue *Q,ElemType x){//入队,增
if((Q->rear+1)%MaxSize == Q->front)//当rear再移一位就到了front的时候,那么队列就满了,这种操作会牺牲一个存储空间,这是由于避免判断条件和队空相同而引起的
return false;
Q->data[Q->rear] = x;
Q->rear = (Q->rear+1) % MaxSize;//取余操作使得存储空间从逻辑上变成了环状
return true;
}
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;
}
bool GetHead(SqQueue *Q,ElemType *x){//得到头元素,查
if(Q->rear==Q->front)
return false;
*x = Q->data[Q->front];
return true;
}
int GetSize(SqQueue *Q){//队列中总元素个数的公式
return (Q->rear-Q->front+MaxSize)%MaxSize;
}