C语言循环队列的实现

循环队列的操作包括初始化、求队列的长度、入队、出队、取队头元素。下面是实现代码:

在初始化之前,先进行预定义:

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
 
typedef int Status;
typedef int ElemType;
 
typedef struct{
        ElemType *base;
        int front;
        int rear;
}SqQueue;


初始化:

Status InitQueue(SqQueue *Q)
{
        Q->base = (ElemType*)malloc(sizeof(ElemType)*MAXSIZE);
        if (!Q->base)
                  exit(OVERFLOW);
        Q->front = 0;
        Q->rear = 0;
        return OK;
}


先在内存中分配100ElemType类型的空间,然后让Q->base指向首地址。判断Q->base是否为NULL,如果是,说明分配失败,则退出;不为NULL的时候,让Q->frontQ->rear0

求队列长度:

int QueueLength(SqQueue Q)
{
        return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}


Q->rear减去Q->front再加MAXSIZE后对MAXSIZE求余能得到长度。

入队:

Status EnQueue(SqQueue *Q, ElemType e)
{
        if ((Q->rear + 1) % MAXSIZE == Q->front)
                  return ERROR;
        Q->base[Q->rear] = e;
        Q->rear = (Q->rear + 1) % MAXSIZE;
        return OK;
}


插入之前,先判断队列是否已满,如果已满,返回错误。将e赋值给Q->base[Q->rear](即插入队尾)。然后将队尾后移一位。

出队:

Status DeQueue(SqQueue *Q, ElemType *e)
{
        if (Q->rear == Q->front)
                  return ERROR;
        *e = Q->base[Q->front];
        Q->front = (Q->front + 1) % MAXSIZE;
        return OK;
}


出队之前,先判断队是否为空队,如果是,则返回错误。将队头元素Q->base[Q->front]赋值给*e,然后将队头向后移动一位即可。

取队头元素:

ElemType GetHead(SqQueue Q)
{
        if (Q.front == Q.rear)
                  return ERROR;
        return Q.base[Q.front];
}


先判断是否为空队,如果为空,则返回错误,不为空的话返回首元素。

加入main()测试:

int main(void)
{
        SqQueue Q;
        ElemType e;
        int n;
        printf("1.初始化\n2.求队列长度\n3.入队\n4.出队\n5.队头元素\n6.退出\n");
        while (1)
        {
                  printf("请选择:");
                  scanf("%d", &n);
                  switch (n)
                  {
                  case 1:
                           if (InitQueue(&Q) == OK)
                                    printf("初始化成功!\n");
                           else
                                    printf("初始化失败!\n");
                           break;
                  case 2:
                           printf("队列长度为:%d\n", QueueLength(Q));
                           break;
                  case 3:
                           printf("输入要插入的元素:");
                           scanf("%d", &e);
                           if (EnQueue(&Q, e) == OK)
                                    printf("插入成功!\n");
                           else
                                    printf("插入失败!\n");
                           break;
                  case 4:
                           if (DeQueue(&Q, &e) == OK)
                                    printf("%d已经出队\n", e);
                           else
                                    printf("失败!\n");
                           break;
                  case 5:
                           printf("队头元素为:%d\n", GetHead(Q));
                           break;
                  case 6:
                           exit(0);
                  }
        }
        return 0;
}


C语言循环队列的实现


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值