数据结构—顺序循环队列(附代码实现)

队列

概念
队列也是一种特殊的线性表。不过,线性表允许在任何位置插入和删除,而队列只允许在队尾插入,在队头删除,这样它就具有先进先出的性质

重点

顺序循环队列的假溢出问题
由于队尾指针rear的值和队头front的值不能由所定义存储空间的最大值自动转为所定义存储空间的最小值而产生

为了解决这个问题,有三种方法可以选择
1 少用一个存储单元
如果少用一个存储空间,则以队尾指针加1等于队头指针为队列满的判断条件,那么此时判断队列满的条件为
(rear+1)%Maxsize ==front
队列空的判断条件为:
rear=front;
(2)设置一个标志位

设置标志位为tag,初始时置tag=0;每当如队列操作成功,就置tag=1;每当出队列操作成功,就置tag=0.
此时队列空的判断条件为
rear==front && tag=0
队列满的条件为
rear==front && tag=1
(3)设置一个计数器
设计数器为count,初始时置count=0;每当如队列成功,就使count++;每当出队列成功,那就让count–。这样,计数器不仅具有计数功能,而且还具有标志位一样的标志作用,则此时队列空的判断条件为:count==0
队列满的条件为:
count>0 &&rear==front;
还可以是:
count=Maxsize;
附代码

#include<stdio.h>
#include<stdlib.h>
#define Maxsize 100

typedef int DataType;

typedef struct    //定义一个结构体
{
    DataType queue[Maxsize];
    int rear;        //队尾指针
    int front;       //队头指针
    int count;       //计数器
}SeqQueue;

void SeqQueueInitiate(SeqCQueue *Q)//队列初始化
{
    Q->rear=0;
    Q->front=0;
    Q->count=0;
}

int QueueNotEmpty(SeqQueue Q)//队列判空
{
    if(Q.count!=0)
        return 1;
    else return 0;
}
int QueueAppend(SeqQueue *Q,DataType x)//入队列
{
    if(Q->count >0 && Q->rear ==Q->front)
    {
        printf("队列已满无法插入");
        return 0;
    }
    else
    {
        Q->queue[Q->rear]=x;//将x插入队尾
        Q->rear=(Q->rear +1)%Maxsize;
        Q->count++;     //计数器加1
        return 1;
    }

}

int QueueDelete(SeqQueue *Q,DataType *d)//出队列
{
    if(Q->count ==0)
    {
        printf("队列已空\n");
        return 0;
    }
    else
    {
        *d=Q->queue[Q->front];//用指针d保存要删除的元素
    Q->front=(Q->front+1)%Maxsize;  //队头元素都给前移一位
    Q->count--;
    return 1;
    }

}
int QueueGet(SeqQueue Q,DataType *d)//取数据
{
    if(Q.count ==0)
    {
        printf("队列已空无数据可取!\n");
        return 0;
    }
    else
    {
        *d=Q.queue[Q.front];
        return 1;

    }
}
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
顺序循环队列是一种使用顺序存储结构实现队列。它通过将队列的首尾相连,构成一个循环的结构,解决了普通队列在出队操作时需要移动元素的问题,提高了算法效率。[2] 顺序循环队列的结构定义如下: ```c #define SIZE 8 typedef struct Queue { int elem[SIZE]; // 存放队列元素 int front; // 队头 int rear; // 队尾 } Queue, *QueueS; ``` 其中,`elem`数组用于存放队列元素,`front`表示队头的位置,`rear`表示队尾的位置。当队列为空时,`front`和`rear`的值相等;当队列满时,`rear`的下一个位置就是`front`。通过这种方式,可以实现循环利用队列存储空间顺序循环队列的操作包括入队和出队操作。入队操作将元素插入到队尾,同时更新`rear`的位置;出队操作将队头元素删除,同时更新`front`的位置。当队列满时,无法进行入队操作;当队列为空时,无法进行出队操作。因此,需要额外的判断条件来判断队列是否满或为空。 顺序循环队列实现可以通过取模运算来实现循环的效果,即在计算`rear`和`front`的位置时,使用`(rear + 1) % SIZE`和`(front + 1) % SIZE`来计算新的位置。 总结来说,顺序循环队列是一种通过循环利用队列存储空间来提高算法效率的数据结构。它使用顺序存储结构实现,通过将队列的首尾相连构成循环结构,解决了普通队列在出队操作时需要移动元素的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值