数据结构——队列

来源:互联网 发布:怎么举报淘宝卖家骂人 编辑:程序博客网 时间:2024/05/26 19:14

数据结构——队列

 

宗旨:技术的学习是有限的,分享的精神是无限的。

 

1、特性:先进先出(FIFO

 

2、应用:

       图形的广度优先搜索法

       优先队列

       操作系统的工作调度

 

3、用数组仿真队列

1)队列数组结构

int queue[MAX_SIZE]; //队列最大容量int front = -1; //队列头,随数据的输出变动int rear = -1;   //队列尾,随数据的输入变动

2)数据的存取【数据输入是从后端rear进行,数据取出是从前端front进行】           

       数据存入队列:将队尾指针往rear后移一位:若队尾rear小于等于队列的最大索引值MAX_SIZE-1,则将数据存入rear所指的数组元素中,否则无法存入数据。

void add_queue(int value){  if(rear >= MAX_SIZE)  {    printf("thequeue is full!\n");  }  else  {    rear++;    queue[rear] = value;  }}

      数据取出队列:检查队列中是否有数据存在;若头指针front等于尾指针rear,则表示队列中无数据;若头指针不等于尾指针,则将头指针往后移;取出头指针所指的数组元素内容。

int del_queue(void){  int temp;  if(front == rear)  {    return -1;  }  else  {    front++;    temp = queue[front];    queue[front] = 0;    return temp;  }}

4、用链表仿真队列

1)队列链表结构

typedef struct node{  int data;  struct node *next;} list, *link;link front = NULL; //向链表顶端的指针link rear = NULL;  //向链表尾端的指针

2)数据的存取                        

         数据输入队列【push】:建立一个新节点;判断队尾指针rear是否为NULL,若为NULL,则此新节点为队列的第一个数据,front和rear都指向它,若不为NULL,将rear所指节点的指针指向新节点,将rear指向新节点。

void add_queue(int value){  link new;  new = (link)malloc(sizeof(list));  new-> data = value;  new-> next = NULL;  if(rear == NULL)  {    front = new;  }  else  {    rear-> next = new -> next;  }  rear = new;}

       数据输出堆栈【pop】:先保留队头指针front所指的位置;将头指针front指向下一个节点;取出之前保留指针所指的节点内容;释放之前保留头指针所指向的节点内容。

int pop(void){  link top;  int temp;  if(front != NULL)  {    top = front;    front = front -> next;            temp = top -> data;    free(top);    return temp;  }  return -1;}

5、环形链表

       当插入数据时,尾指针rear会向后移动;而输出数据时,头指针front会向后移动。

       当尾指针rear等于MAX_SIZE-1时,需回到队列最前端:(rear+ 1)% MAX_SIZE

       尾指针等于头指针:

              队列为空:front= rear;

              队列为满:(rear+ 1)% MAX_SIZE

void add_queue(int value){  rear = (rear + 1) % MAX_SIZE;  if(front == rear)  {    printf("queueis full!\n");  }  else  {    queue[rear] = value;  }}int del_queue(void){  int temp;  if(front == rear)  {    return - 1;  }  temp = queue[front + 1];  //queue[front+ 1] = 0;  front = (front + 1) % MAX_SIZE;  return temp;}



0 0