14-数据结构_队列-算法实现

---------------------------------

定义 循环队列

初始化 队列

入队

出队

遍历

是否已满

是否已空

---------------------------------

定义 循环队列

// 定义 循环队列
typedef struct Queue
{
    int * pBase;// 底层数组
    int front;  // 队首 下标
    int rear;   // 队尾 下标
} QUEUE;

初始化 队列

// 初始化 队列
void init(QUEUE * qQueue)
{
    printf("输入循环队列的长度 : ");
    scanf("%d", &queueLen);
    // 数组
    qQueue->pBase = (int *) malloc( sizeof(int) * queueLen );
    // 
    qQueue->front = 0;
    qQueue->rear = 0;

    return;
}

入队

// 入队
bool enterQueue(QUEUE * pQueue, int value)
{
    if ( isFull(pQueue) )
    {
        return false;
    }
    
    // 在 rear 索引处 放入值
    pQueue->pBase[pQueue->rear] = value;

    // rear 索引 加1
    pQueue->rear = (pQueue->rear + 1) % queueLen;

    return true;
}

出队

// 出队
bool outQueue(QUEUE * pQueue, int * pValue)
{
    if ( isEmpty(pQueue) )
    {
        return false;
    }
    // 记录出队的元素的值
    *pValue = pQueue->pBase[pQueue->front];

    // 出队
    pQueue->front = (pQueue->front + 1) % queueLen;

    return true;
}

遍历

// 遍历
void traverseQueue(QUEUE * pQueue)
{
    printf("======遍历======\n");

    int start = pQueue->front;

    for (; start != pQueue->rear; start = (start + 1) % queueLen)
    {
        printf("%d\n", pQueue->pBase[start]);
    }

    return;
}

是否已满

// 判断队列是否已满
bool isFull(QUEUE * pQueue)
{
    if ( (pQueue->rear + 1) % queueLen == pQueue->front )
    {
        return true;
    }
    return false;
}

是否已空

// 判断队列是否已空
bool isEmpty(QUEUE * pQueue)
{
    if (pQueue->rear == pQueue->front)
    {
        return true;
    }    
    return false;
}

完整代码 07-queue.c

#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>

int queueLen;   // 全局变量, 队列长度

// 定义 循环队列
typedef struct Queue
{
    int * pBase;// 底层数组
    int front;  // 队首 下标
    int rear;   // 队尾 下标
} QUEUE;

// 初始化 队列
void init(QUEUE * qQueue);
// 入队
bool enterQueue(QUEUE * pQueue, int value);
// 出队
bool outQueue(QUEUE * pQueue, int * pValue);
// 遍历
void traverseQueue(QUEUE * pQueue);
// 判断队列是否已满
bool isFull(QUEUE * pQueue);
// 判断队列是否已空
bool isEmpty(QUEUE * pQueue);

int main(void)
{
    QUEUE queue;   
    // 初始化
    init(&queue);

    // 入队
    int count;
    for (count = 0; count < 4; ++count)
    {
        if ( ! enterQueue(&queue, count + 1) )
        {
            printf("%d, 入队失败!!!\n", count + 1);
            continue;
        }
        printf("%d, 入队成功!\n", count + 1);
    }
    
    // 遍历
    traverseQueue(&queue);
    
    // 出队
    int value;
    for (count = 0; count < 13; ++count)
    {
        if (outQueue(&queue, &value))
        {
            printf("出队成功, 出队元素的值: %d\n", value);
            continue;
        }
        printf("出队失败, 再接再励!!\n");
    }

    traverseQueue(&queue);
    return 0;
}


// 初始化 队列
void init(QUEUE * qQueue)
{
    printf("输入循环队列的长度 : ");
    scanf("%d", &queueLen);
    // 数组
    qQueue->pBase = (int *) malloc( sizeof(int) * queueLen );
    // 
    qQueue->front = 0;
    qQueue->rear = 0;

    return;
}


// 入队
bool enterQueue(QUEUE * pQueue, int value)
{
    if ( isFull(pQueue) )
    {
        return false;
    }
    
    // 在 rear 索引处 放入值
    pQueue->pBase[pQueue->rear] = value;

    // rear 索引 加1
    pQueue->rear = (pQueue->rear + 1) % queueLen;

    return true;
}

// 判断队列是否已满
bool isFull(QUEUE * pQueue)
{
    if ( (pQueue->rear + 1) % queueLen == pQueue->front )
    {
        return true;
    }
    return false;
}

// 遍历
void traverseQueue(QUEUE * pQueue)
{
    printf("======遍历======\n");

    int start = pQueue->front;

    for (; start != pQueue->rear; start = (start + 1) % queueLen)
    {
        printf("%d\n", pQueue->pBase[start]);
    }

    return;
}

// 出队
bool outQueue(QUEUE * pQueue, int * pValue)
{
    if ( isEmpty(pQueue) )
    {
        return false;
    }
    // 记录出队的元素的值
    *pValue = pQueue->pBase[pQueue->front];

    // 出队
    pQueue->front = (pQueue->front + 1) % queueLen;

    return true;
}

// 判断队列是否已空
bool isEmpty(QUEUE * pQueue)
{
    if (pQueue->rear == pQueue->front)
    {
        return true;
    }    
    return false;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值