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