顺序队列 ——循环队列(C语言)

顺序队列的表示与相关操作

1. 结构的定义(动态分配内存)

typedef struct
{
    ElemType *elem; //动态数组
    int front; //表示队头指针
    int rear; //表示队尾指针
}SqQueue;

2. 队列的初始化

/*
    @description: 队列的初始化
    @return: 
    @author: sch
 */
bool InitQueue(SqQueue &Q)
{
    Q.elem = (ElemType*) malloc(MAXSIZE * sizeof(ElemType));
    if(!Q.elem)
    {
        free(Q.elem);
        return false;
    }
    Q.front = Q.rear = 0;
    return true;
}

3. 判断队列是否为空

/*
    @description: 判断队列是否为空,当队头和队尾指针指向同一个时队列为空
    @return:
    @author: sch
 */
bool isEmpty(SqQueue &Q)
{
    return (Q.front == Q.rear) ? true : false;
}

4. 判断是否队满

/*
    @description: 
        判断是否队满,条件(Q.rear + 1) % MAXSIZE[牺牲最后一个存储单元]。
    PS:另设立QueueSize或flag可判断是否队满
    
    @return:
    @author: sch
 */
bool isFull(SqQueue &Q)
{
    return (Q.front == ((Q.rear + 1) % MAXSIZE)) ? true : false;
}

5. 获取队内元素个数

/*
    @description: 获取队列长度(即队内元素个数)
    @return:
    @author: sch
 */
int QueueLength(SqQueue &Q)
{
    return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}

6. 向队尾插入元素

/*
    @description: 向队内插入元素
    @return:
    @author: sch
 */
bool Push_back(SqQueue &Q, ElemType e)
{
    if(isFull(Q)) return false;
    Q.elem[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MAXSIZE;
    return true;
}

7. 弹出队头元素

/*
    @description: 弹出队头元素并获取队头元素的值
    @return:
    @author: sch
 */
bool Pop_front(SqQueue &Q, ElemType e)
{
    if(isEmpty(Q)) return false;
    e = Q.elem[Q.front];
    Q.front = (Q.front + 1) % MAXSIZE;
    return true;
}

8. 遍历队内元素

/*
    @description: 遍历队列中的每个元素
    @return:
    @author: sch
 */
void QueueTraverse(SqQueue Q)
{
    int l = Q.front, r = Q.rear;
    while(l != r)
    {
        printf("%d\n", Q.elem[l]);
        l = (l + 1) % MAXSIZE;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值