• 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;
    }
    
  • 相关阅读:
    JNI 对象处理 (转)
    快速配置vs2012+opencv
    Jni中C++和Java的参数传递(转)
    版本控制之四:SVN客户端重新设置帐号和密码(转)
    版本控制之三:SVN合并及解决冲突(转)
    版本控制之二:SVN的初步使用(转)
    版本控制之一:SVN服务器搭建与安装(转)
    xml读取一行数据
    方法论:怎样练习一万小时
    一位软件工程师的6年总结(转)
  • 原文地址:https://www.cnblogs.com/darkchii/p/7389867.html
Copyright © 2020-2023  润新知