zoukankan      html  css  js  c++  java
  • 队列

    /*    队列:
        1、什么叫队列:一个能够实现先进先出的存储结构
        2、队列的分类:链式队列,静态队列(数组队列)
        3、队列的参数:front,rear
    
        静态队里:
        1、静态队列为什么是循环队列:队列先进先出,不管我入队还是出队,front rear都得++,往上走。
            当删除的时候,f往上走,内存就泄露。所以我需要用循环来解决这个问题。内存最大利用化。
        2、循环队列需要几个参数来确定:循环队列需要两个参数来确定,front,rear 
        3、循环队列各个参数的含义:front,rear是数组的下标,而不是指针
            front:表示队列的第一个元素
            rear:表示队列最后一个有效元素的下一个
            队列的初始化:front rear都为零的时候
            front rear的值相等,但不一定为零
        4、循环队列入队伪算法:将值存入r所代表的位置,然后把r往后走,
            错误的写法:rear=rear+1;rear=(rear+1)% 队列的长度
        5、循环队列出队伪算法:front=(front+1)% 数组的长度
        6、如何判断循环队列为空:front=rear; 
        7、如何判断循环队列已满:front=(rear+1)% 数组的长度,否则不满
        队列的长度是n,队列只能存储n-1个值,必须有一个为空,便于操作
        8、队列的应用:凡是与时间有关的,都有队列的影子
    */
    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    typedef struct queue
    {
        int * pBase;
        int front;
        int rear;
    }Queue, * pQueue;
    typedef int bool;
    #define true 1
    #define false 0
    void init_queue(Queue *);
    bool out_queue(Queue *, int *);
    bool is_empty(pQueue);
    bool is_full(pQueue);
    bool en_queue(pQueue, int);
    void traverse_queue(const pQueue);
    int main(void)
    {
        Queue Q;
        int val;
        init_queue(&Q);
        en_queue(&Q, 44);
        en_queue(&Q, 38);
        en_queue(&Q, 23);
        en_queue(&Q, 49);
        en_queue(&Q, 65);
        en_queue(&Q, 97);
        en_queue(&Q, 8);
        en_queue(&Q, 9);
        traverse_queue(&Q);
        out_queue(&Q, &val);
        traverse_queue(&Q);
        out_queue(&Q, &val);
        
        return 0;
    }
    void init_queue(Queue * pQ)
    {
        pQ->pBase=(int *)malloc(sizeof(int)*7);//个体存储+个体关系的存储
        if(pQ->pBase==NULL)
        {
            puts("内存分配失败!");
            exit(-1);
        }
        pQ->front=0;
        pQ->rear=0;
        return;
    }
    
    bool out_queue(pQueue pQ, int * pVal)
    {
        if( is_empty(pQ) )
            return false;
        *pVal=pQ->pBase[pQ->front];
        printf("出队的数是:%d
    ",*pVal);
        pQ->front=(pQ->front+1)%7;
        
        return true;
    }
    bool is_empty(pQueue pQ)
    {
        if( pQ->front== pQ->rear )
            return true;
        else
            return false;
    }
    bool en_queue(pQueue pQ, int val)
    {
        if( is_full(pQ) )
            return false;
        else
        {
            pQ->pBase[pQ->rear]=val;
            pQ->rear=(pQ->rear+1)%7;
            return true;
        }
    }
    bool is_full(pQueue pQ)
    {
        if( (pQ->rear+1)%7==pQ->front )
            return true;
        else
            return false;
    }
    
    void traverse_queue(const pQueue pQ)
    {
        while( (pQ->front+1)%7 != pQ->rear )
        {
            printf("%d	",pQ->pBase[pQ->front]);
            pQ->front=(pQ->front+1)%7;
            
        }
        putchar('
    ');
        return;
    }
  • 相关阅读:
    Linux内核学习笔记(6)-- 进程优先级详解(prio、static_prio、normal_prio、rt_priority)
    Cuteftp连接虚拟机Centos7
    Linux内核学习笔记(5)-- 进程调度概述
    Linux内核学习笔记(4)-- wait、waitpid、wait3 和 wait4
    Linux内核学习笔记(3)-- 进程的创建和终结
    Linux内核学习笔记(2)-- 父进程和子进程及它们的访问方法
    Linux内核学习笔记(1)-- 进程管理概述
    汇编基础--标识符、标号、伪指令和指令
    JAVA学习笔记--正则表达式
    JAVA学习笔记--字符串概述
  • 原文地址:https://www.cnblogs.com/fengkui/p/6117948.html
Copyright © 2011-2022 走看看