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 python开发环境搭建
    python中的构造函数和析构函数
    socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别?
    Render和template?
    什么是MemCache
    python下 help()使用方法
    Tornado模块分类和各模块之间的关系
    把python项目部署到centos里
    Jquery对回复者添加匿名评论选项
  • 原文地址:https://www.cnblogs.com/guoshiyv/p/7154902.html
Copyright © 2011-2022 走看看