数据结构与算法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;
    }

}

 

posted on 2017-07-14 12:44  guoshiyv  阅读(127)  评论(0编辑  收藏  举报

导航