您的位置:首页 > 理论基础 > 数据结构算法

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

2013-07-30 22:20 513 查看
---------------------------------

定义 循环队列

初始化 队列

入队

出队

遍历

是否已满

是否已空

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

定义 循环队列

// 定义 循环队列
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; }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: