手撕c语言数据结构---循环队列的顺序存储结构( part 1 )

循环队列的c语言顺序存储结构的实现

本文用c语言实现了循环队列的顺序存储结构,有几点需要注意:

  1. 本文实现的是顺序存储结构的循环链表,不是链式结构(敬请期待)
  2. 队尾指针指向下一个元素入队时的位置,不指向队尾元素
  3. 队头指针指向队头元素(也就是下一个出队的元素)
  4. 为了判别队空队满的不同,要留出一个格子不存放元素(还有其他方式,不浪费格子也可以区分空与满,敬请期待)
  5. 有问题请私信,能帮到您是我最大荣幸
  6. 本文代码参考了《王道考研数据结构》中的代码,是笔者备考考研过程中自己敲得代码,运行测试过,暂时没发现问题。
#include<stdio.h>
#include<stdbool.h>

#define MaxSize 10
/*
利用顺序存储实现的一个 循环链表
    1.头指针front指向队头(出队的位置)的元素
    2.尾指针rear指向队尾(入队位置)的下一个位置
    3.这样的设计,导致我们需要留下预分配空间中的一位,以便于区分队空和队满
    4.队空的条件为:rear==front;队满的条件为:(rear+1)%MaxSize==front
    5.注意:头指针和尾指针都是int变量,直接存储数组中元素的序号
*/

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


//初始化队列,头指针和尾指针指向同一个位置(也就是队列判空的条件),0
void InitQueue(SqQueue *Q){
    (*Q).rear=(*Q).front=0;
}

bool QueueEmpty(SqQueue Q){
    if(Q.front==Q.rear){
        printf("队列为空\n");
        return true;
    }

    else{
        printf("队列不空\n");
        return false;
    }
}

//入队操作,首先需要判断队列是否已满
bool EnQueue(SqQueue *Q, int x){
    if((*Q).front == ( (*Q).rear+1 ) % MaxSize)
    {
        printf("Error:队列已满,新元素无法入队\n");
        return false;
    }

    (*Q).data[ (*Q).rear ] = x;//把元素放到目前rear指针所指的位置
    (*Q).rear = ( (*Q).rear+1 ) % MaxSize;//由于指针指向的是队尾的下一个元素,所以我们还要移动指针,为了解决循环队列“伪溢出”的问题我们引入模运算来构造循环队列
    return true;
}

//出队操作,首先需要判断队列是否已空
bool Dequeue(SqQueue *Q, int *x){
    if( (*Q).front==(*Q).rear )
    { 
        printf("ERROR:队列已空,出队失败\n");
        return false;
    }

    (*x)=(*Q).data[ (*Q).front ];//x变量用于返回被删除节点的元素值
    (*Q).front=( (*Q).front+1 )%MaxSize;//移动队头指针
    return true;
}

//获取队头元素的值,用x返回
bool GetHead(SqQueue Q, int *x){
    if(Q.rear==Q.front)
    {
        printf("Error:队列中没有元素,队头元素不存在\n");
        return false;
    }
    *x=Q.data[Q.front];
    return true;
}

 int main(){
    /*自己要用的代码*/
    return 0;
 }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值