环形队列实现

前面的顺序队存在一些小问题,当队满也就是rear==MaxSize-1时,表示队满,实则是上溢出,队列中可能还存在空位置,这个情况也就是假溢出。可以使用环形队列解决这个问题:

队头指针:front循环增1 front = (front+1)%MaxSize

队尾指针:rear循环增1 front = (rear+1)%MaxSize

此时队头队尾指针都初始化为0.

为了区分队空队满,我们将 队尾指针增1等于队头指针 作为队满条件,如此我们将少用一个元素空间。队空条件 队尾队头指针相等。

函数列表

void DestroyStack(SqQueue * s);//销毁队列
bool EmptyStack(SqQueue * s);//判空
bool enQueue(SqQueue *s,ElemType e);//入队操作
bool dlQueue(SqQueue *s,ElemType e);//出队操作
int Count(SqQueue *s);

1.头文件

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MaxSize 50
typedef char ElemType;

2.初始化队列

typedef struct {
    ElemType data[MaxSize];
   int front,rear;
}SqQueue;

 SqQueue *q;
    q = (SqQueue * ) malloc(sizeof(SqQueue));
    q -> front = q -> rear = 0;

3.销毁队列

void DestroyQueue(SqQueue * s) {
    free(s);
    printf("销毁成功\n");
}

4.判空

bool EmptyQueue(SqQueue * s){
    if(s -> front == s -> rear){
        printf("队列为空\n");
        return false;
    } else{
        printf("队列不为空\n");
        return true;
    }
}

5.进队

bool enQueue(SqQueue *s,ElemType e){
    if((s -> rear + 1) % MaxSize == s -> front){
        printf("队列上溢出\n");
        return false;
    }
    s -> rear = (s -> rear + 1) % MaxSize;
    s -> data[s -> rear] = e;
    printf("入队成功\n");
    return true;
}

6.出队

bool dlQueue(SqQueue *s,ElemType e){
    if(s -> front == s -> rear){
        printf("队列空下溢出\n");
        return false;
    }
    s -> front = (s -> front + 1) % MaxSize;
    e = s -> data[s -> front];
    printf("%c出队成功\n",e);
    return true;
}

7.统计队列元素

int Count(SqQueue *s){
    int x = (s -> rear - s -> front + MaxSize) % MaxSize;
    printf("队列中有%d个元素\n");
    return x;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值