zoukankan      html  css  js  c++  java
  • 数据结构与算法2-4 队列

    队列的原理:

    ===FIFO===:first in first out

    队首进行删除,队尾进行插入

    顺序队列:

    利用数组

    front指向上一次被删除的那个数的坐标,即当前队列中第一个元素的前一下标,每次删除+1

    rear:指向最后一个数的坐标,即最新插入的数字,每次插入+1

    front=rear 空了 

    rear=max-1没有利用空间了

    引申:环形队列,利用率高

    问题:front 与 rear 之间的距离差有0-max-1,共max个

              存有几个元素有0-max,max+1中情况

    导致:front==rear时难以分辨空与满

    解决方法:1.利用size,存放队列中个数

                    2.利用tag,区分上一次操作是删除还是插入

                    3.最多只存放max-1个数,即认为存满了

    1.

    size方式:
    typedef struct Node()
    {
        ElementType data[max];
        int front;
        int rear;
        int size;  
    }Queue;
    Queue
    *Ptrl; 初始化:front=rear=max-1; Ptrl->size=0; void add(ElementType x,Line *Ptrl) { if(Ptrl->rear==Ptrl->front) { if(Ptrl->size==max) (printf("");return;) } Ptrl->rear=(Ptrl->rear+1)%max; Ptrl->data[Ptrl->rear]=x; Ptrl->size=Ptrl->size+1; } ElementType del(List *Ptrl) { if(Ptrl->rear==Ptrl->front) { if(Ptrl->size==0) (printf("empty");return NULL;) }else { Ptrl->front=(Ptrl->front+1)%max; Ptrl->size=Ptrl->size-1; return Ptrl->data[Ptrl->front]; } }

    2.

    tag方式:
    typedef struct Node()
    {
        ElementType data[max];
        int front;
        int rear;
        int tag;  删除为1,插入为0
    }Queue;
    Queue *Ptrl;
    初始化:Ptrl->front=Ptrl->rear=max-1; Ptrl->tag=1;
    
    void add(ElementType x,Line *Ptrl)
    {
       if(Ptrl->rear==Ptrl->front)
       {
        if(Ptrl->tag==0) (printf("");return;)
       }
    Ptrl
    ->rear=(Ptrl->rear+1)%max; Ptrl->data[Ptrl->rear]=x; Ptrl->tag=0;
    return;
    }
    
    
    ElementType del(List *Ptrl)
    {
    
        if(Ptrl->rear==Ptrl->front)
        { 
            if(Ptrl->tag==1) (printf("空");return NULL;)
    
        }
                Ptrl->front=(Ptrl->front+1)%max;
    Ptrl->tag=1; return Ptrl->data[Ptrl->front]; }

     3.只存放max-1个数

    (Ptrl->rear+1)%max==Ptrl->front  满
    Ptrl->front==Ptrl->rear  空

    链式队列

    front处理删除,使得先入先出;

    rear处理插入,将最新插入的放在最后。

    typedef struct Node
    {
        ElementType data;
        struct Node *Next;
    }Queue;
    
    typedef struct 
    {    
        Queue *front;
        Queue *rear;
    }QueueStack
    
    QueueStack MakeEmpty()
    {
        QueueStack *Ptrl;
        Ptrl=(QueueStack *)malloc(sizeof(QueueStack));
        Ptrl->front=Ptrl->rear=NULL;
        return Ptrl;
    }
    
    void add(ElementType x,QueueStack *Ptrl)
    {
        Queue *temp,now;
        temp=(Queue *)malloc(sizeof(Queue));
        temp->data=x;
        temp->Next=NULL;
    
        if(Ptrl->front==NULL)
        {
            Ptrl->front=temp;
            Ptrl->rear=temp;
        }
        else{
             now=Ptrl->rear;
             now->Next=temp;
             Ptrl->rear=temp;  
    
        }
    
    }
    ElementType del(QueueStack *Ptrl)
    {   ElementType tempdata;
        Queue *temp;
        if(Ptrl->front=NULL) {printf("empty");return NULL;}
        else 
        {        temp=Ptrl->front;
                tempdata=temp->data;
            if(Ptrl->front==Ptrl->rear)
            {
                 Ptrl->front=Ptrl->rear=NULL;          
            }
    
            else{
                  Ptrl->front=temp->Next;
                
            }
           free(temp);
                return tempdata;
        }
    
    }
  • 相关阅读:
    解决Eclipse点击运行后控制台不能自动弹出的问题
    vc中的空格怎么变成了“ `”或“^”,怎么变回来
    ping百度域名时的收获
    java学习(权限修饰符)
    can't create socket (must run as root?) : Permission denied
    Zabbix各种报错信息和遇到的问题
    windows2012r2 更改管理员密码
    Zabbix钉钉机器人报警
    用route命令添加永久路由
    zabbix使用jmx监控tomcat
  • 原文地址:https://www.cnblogs.com/guoshiyv/p/7154902.html
Copyright © 2011-2022 走看看