Bootstrap

C语言循环队列的实现以及相关操作(初始化、清空队列、销毁队列、判空、求长度、取队头元素、入队、出队)

C语言循环队列的实现以及相关操作

一、队列的定义

只允许对序列的两端进行操作,允许插入的一端称为队尾,允许删除的一端称为队头

注意:在对队列进行入队出队操作时,有可能会造成假溢出问题,如图(f)
在这里插入图片描述
解决方法有两个:
1.每次出队时,把所有元素往前移动
2.循环队列
但是循环队列无法通过条件Q.front==Q.rear来判断队列是空还是满,如图(b)和图(c)在这里插入图片描述
解决方法:
1.设置一个标志域,来判断队列的状态
2.设置一个长度域,来判断队列的状态
3.少用一个元素空间,一旦Q.front==(Q.rear+1)%Q.maxsize,则认为队满,以下介绍这种解决方法的循环队列

二、循环队列的结构体描述以及其他定义

#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef struct {
    char * elem;
    int head;//队头下标
    int rear;//队尾下标
    int maxsize;//最大容量
}SqQueue;

三、相关操作

1.初始化
Status InitQueue_Sq(SqQueue *Q,int size){
    Q->elem=(char *)malloc(size*sizeof(char));
    if(Q->elem==NULL)return OVERFLOW;
    Q->maxsize=size;//少用一个元素位置,如果size是6,则只有5个空间可以装元素
    Q->head=Q->rear=0;
    return OK;
}
2.销毁
Status DestroyQueue_Sq(SqQueue *Q){
    free(Q->elem);
    Q->elem=NULL;
    Q->head=Q->rear=0;
    return OK;
}
3.清空
void ClearQueue_Sq(SqQueue *Q){
    Q->head=Q->rear=0;
}
4.判空
Status QueueEmpty_Sq(SqQueue Q){
    if(Q.head==Q.rear){
            printf("队列为空");
    }else{
        printf("队列不为空");
    }
    return OK;
}
5.求长度
int QueueLength_Sq(SqQueue Q){
    return (Q.rear-Q.head+Q.maxsize)%Q.maxsize;
}
6.取队头元素,并且赋值给e返回
Status Gethead_Sq(SqQueue Q,char *e){
    if(Q.head==Q.rear)return OVERFLOW;
    *e=Q.elem[Q.head];
    return OK;
}
7.入队
Status EnQueue_Sq(SqQueue *Q,char e){
    if((Q->rear+1)%Q->maxsize==Q->head){
        printf("队满!入队失败");
        return OVERFLOW;
    }
    Q->elem[Q->rear]=e;
    Q->rear=(Q->rear+1)%Q->maxsize;
    return OK;
}
8.出队
Status DeQueue_Sq(SqQueue *Q,char *e){
    if(Q->head==Q->rear){
        printf("队空!出队失败");
        return OVERFLOW;
    }
    *e=Q->elem[Q->head];
    Q->head=(Q->head+1)%Q->maxsize;
    return OK;
}
;