ArrayQueue(队列)

  code1:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define MAXSIZE 65533

#define bool int
#define true 1
#define false 0

typedef int KeyType;

typedef struct queue
{
    KeyType * key;
    int front;
    int rear;
    int count;
}Queue;

/* 定义所有函数 */
Queue * CreateQueue();
bool QueueIsEmpty();
bool QueueIsFull();
int QueueItemCount();
bool QueueAdd();
bool QueueRemove();
KeyType GetQueueFront();
KeyType GetQueueRear();
void TraverseQueue();
bool ClearQueue();
void DeleteQueue();

//建立队列
Queue * CreateQueue(void)
{
    Queue * p;

    p = (Queue*)malloc(sizeof(Queue));
    p->key = (KeyType*)malloc(sizeof(KeyType));
    p->count = 0;
    p->rear = 0;
    p->front = 0;

    return p;
}

//判断队列是否为空
bool QueueIsEmpty(Queue * p)
{
    return (p->count == 0) ? true : false;
}

//判断队列是否已满
bool QueueIsFull(Queue * p)
{
    return (p->count == MAXSIZE) ? true : false;
}

//返回当前队列元素的个数
int QueueItemCount(Queue * p)
{
    return p->count;
}

//入队
bool QueueAdd(Queue * p, KeyType DATA)
{
    if(QueueIsFull(p))
        return false;
    p->key[p->rear++] = DATA;
    p->count++;
    return true;
}

//出队
bool QueueRemove(Queue * p)
{
    if(QueueIsEmpty(p))
        return false;
    p->front++;
    p->count--;
    return true;
}

//返回队首元素
KeyType GetQueueFront(Queue * p)
{
    if(QueueIsEmpty(p))
        return false;
    return p->key[p->front];
}

//返回队尾元素
KeyType GetQueueRear(Queue * p)
{
    if(QueueIsEmpty(p))
        return false;
    return p->key[p->rear - 1];
}

// 遍历队列
void TraverseQueue(Queue * p)
{
    for(int i = p->front; i < p->rear; i++)
        printf("%d ", p->key[i]);
    printf("
");
}

// 清空队列
bool ClearQueue(Queue * p)
{
    for(int i = p->front; i < p->rear; i++)
        p->key[i] = 0;
    p->count = 0;
    p->front = 0;
    p->rear = 0;

    return true;
}

// 删除队列
void DeleteQueue(Queue * p)
{
    if(p != NULL)
    {
        ClearQueue(p);
        free(p);
        p = NULL;
    }
}

int main()
{
    Queue*h = CreateQueue();
    KeyType val;
    char c;

    puts("按 1 查看            按 2 入队");
    puts("按 3 出队            按 4 返回队首元素");
    puts("按 5 返回队尾元素    按 6 当前队列长度");
    puts("按 7 清空队列        按 8 退出程序");

    while((c = getch()) != '8') {
        switch(c) {
            case '1':
                    puts("队列:");
                    TraverseQueue(h);
                break;
            case '2':
                    puts("输入数据:");
                    scanf("%d", &val);
                    if(QueueAdd(h, val))
                        puts("已加入!");
                    else
                        puts("添加失败!");
                break;
            case '3':
                    if(QueueRemove(h))
                        puts("已移除!");
                    else
                        puts("移除失败!");
                break;
            case '4':
                    printf("
当前队首元素为:%d
", GetQueueFront(h));
                break;
            case '5':
                    printf("
当前队尾元素为:%d
", GetQueueRear(h));
                break;
            case '6':
                    printf("
当前队列个数为:%d
", QueueItemCount(h));
                break;
            case '7':
                    if(ClearQueue(h))
                        puts("已清空!");
                break;
        }
    }
    DeleteQueue(h);

    return 0;
}

  code2:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define MAXSIZE 65533

#define bool int
#define true 1
#define false 0

typedef int KeyType;

typedef struct queue
{
    KeyType * key;
    int front;
    int rear;
}Queue;

/* 定义所有函数 */
Queue * CreateQueue();
bool QueueIsEmpty();
bool QueueIsFull();
int QueueItemCount();
bool QueueAdd();
bool QueueRemove();
KeyType GetQueueFront();
KeyType GetQueueRear();
void TraverseQueue();
bool ClearQueue();
void DeleteQueue();

//建立队列
Queue * CreateQueue(void)
{
    Queue * p;

    p = (Queue*)malloc(sizeof(Queue));
    p->key = (KeyType*)malloc(sizeof(KeyType));
    p->rear = 0;
    p->front = 0;

    return p;
}

//判断队列是否为空
bool QueueIsEmpty(Queue * p)
{
    return (p->front == p->rear) ? true : false;
}

//判断队列是否已满
bool QueueIsFull(Queue * p)
{
    return ((p->rear + 1)%MAXSIZE == p->front) ? true : false;
}

//返回当前队列元素的个数
int QueueItemCount(Queue * p)
{
    return (p->rear - p->front + MAXSIZE) % MAXSIZE;
}

//入队
bool QueueAdd(Queue * p, KeyType DATA)
{
    if(QueueIsFull(p))
        return false;
    p->key[p->rear++] = DATA;
    return true;
}

//出队
bool QueueRemove(Queue * p)
{
    if(QueueIsEmpty(p))
        return false;
    p->front++;
    return true;
}

//返回队首元素
KeyType GetQueueFront(Queue * p)
{
    if(QueueIsEmpty(p))
        return false;
    return p->key[p->front];
}

//返回队尾元素
KeyType GetQueueRear(Queue * p)
{
    if(QueueIsEmpty(p))
        return false;
    return p->key[p->rear - 1];
}

// 遍历队列
void TraverseQueue(Queue * p)
{
    for(int i = p->front; i < p->rear; i++)
        printf("%d ", p->key[i]);
    printf("
");
}

// 清空队列
bool ClearQueue(Queue * p)
{
    for(int i = p->front; i < p->rear; i++)
        p->key[i] = 0;
    p->front = 0;
    p->rear = 0;

    return true;
}

// 删除队列
void DeleteQueue(Queue * p)
{
    if(p != NULL)
    {
        ClearQueue(p);
        free(p);
        p = NULL;
    }
}

int main()
{
    Queue*h = CreateQueue();
    KeyType val;
    char c;

    puts("按 1 查看            按 2 入队");
    puts("按 3 出队            按 4 返回队首元素");
    puts("按 5 返回队尾元素    按 6 当前队列长度");
    puts("按 7 清空队列        按 8 退出程序");

    while((c = getch()) != '8') {
        switch(c) {
            case '1':
                    puts("队列:");
                    TraverseQueue(h);
                break;
            case '2':
                    puts("输入数据:");
                    scanf("%d", &val);
                    if(QueueAdd(h, val))
                        puts("已加入!");
                    else
                        puts("添加失败!");
                break;
            case '3':
                    if(QueueRemove(h))
                        puts("已移除!");
                    else
                        puts("移除失败!");
                break;
            case '4':
                    printf("
当前队首元素为:%d
", GetQueueFront(h));
                break;
            case '5':
                    printf("
当前队尾元素为:%d
", GetQueueRear(h));
                break;
            case '6':
                    printf("
当前队列个数为:%d
", QueueItemCount(h));
                break;
            case '7':
                    if(ClearQueue(h))
                        puts("已清空!");
                break;
        }
    }
    DeleteQueue(h);

    return 0;
}
原文地址:https://www.cnblogs.com/darkchii/p/7389867.html