天天看点

数据结构(三)——队列及实现、循环队列实现

一、队列

    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。  

二、操作和实现

1、结构体定义

2、初始化

3、判断是否为空

4、取得队列的首节点值

5、入队列操作

6、出队列操作

7、打印队列的内容

1、结构体定义
#define LENGTH 100
typedef char datatype;

typedef struct queue{
    datatype data[LENGTH];
    int front;
    int rear;
}sequence_queue;
           
2、初始化
#include"queue.h"

void init_sequence_queue(sequence_queue *sq){
    sq->front = 0;
    sq->rear = 0;
}
           
3、判断是否为空
#include"queue.h"

bool is_empty_sequence_queue(sequence_queue *sq){
    return (sq->front == sq->rear ? true:false);
}
           
4、取得队列的首节点值
#include"queue.h"

datatype get_head(seqence_queue *sq){
    if(sq->front == sq->rear){
        printf("the queue is empty!\n");
        exit(1);
    }
    return sq->data[sq->front]; 
}
           
5、入队列操作
#include"queue.h"

void insert_sequence_queue(sequence_queue *sq,datatype data){
    if(sq->rear == LENGTH){
        printf("the queue is full\n");
        exit(1);
    }
    sq->data[sq->rear] = data;
    sq->rear++;
}
           
6、出队列操作
#include"queue.h"

datatype delete_sequence_queue(sequence_queue *sq){
    if(sq->rear == sq->front){
        printf("the queue is empty!\n");
        exit(1);
    }   
    sq->front++;
    return sq->data[sq->front-1];
}
           
7、打印队列的内容
#include"queue.h"

void display_sequence_queue(sequence_queue *sq){
    if(sq->front == sq->rear){
        printf("the queue is empty!\n");
        exit(1);
    }   
    int i ;
    for(i = sq->front;i<sq->rear;i++){
        priintf("%c ",sq->data[i]);
    }
}
           

三、循环队列

    由于队列有元素出列,front就向后移动,所以队列前面的空间就空了出来。为了更合理的利用空间,人们想了一个办法:将队列的首尾相连接。这样当rear移动到LENGTH时,会再从0开始循环。那当什么时候队列满呢?当rear等于front的时候。可是队列为空的时候也是同样的条件,那不就没法判断了吗?又有人提出了这样的想法:牺牲一个存储空间,front前面不存数据,当rear在front前面的时候就是满了,如图:
数据结构(三)——队列及实现、循环队列实现

    当rear在front之前时,队列中剩余一个空间,有 LENGTH - 1个元素,所以rear也为LENGTH - 1。这时就算是队列满了。于是

    满的判断条件应为:(rear+1)%LENGTH == front 。

    空的判断条件为 rear == front。

所以一些操作有些变化: 

5、入队列操作
#include"queue.h"

void insert_sequence_queue(sequence_queue *sq,datatype data){
    if((sq->rear+1)%LENGTH == sq->front){
        printf("the queue is full\n");
        exit(1);
    }
    sq->data[sq->rear] = data;
    sq->rear= (sq->rear+1)%LENGTH;
}
           
6、出队列操作
#include"queue.h"

datatype delete_sequence_queue(sequence_queue *sq){
    if(sq->rear == sq->front){
        printf("the queue is empty!\n");
        exit(1);
    }  
    if(sq->front+1 == LENGTH){
        sq->front = (sq->front+1)%LENGTH;       //其实就是0     
        return sq->data[LENGTH-1];
    }        
    sq->front++;
    return sq->data[sq->front-1];
}
           
7、打印队列的内容
#include"queue.h"

void display_sequence_queue(sequence_queue *sq){
    if(sq->front == sq->rear){
        printf("the queue is empty!\n");
        exit(1);
    }   
    int i ;
    for(i=sq->front;i!=sq->rear;){
        printf("%c ",sq->data[i]);            
        i=(i+1)%LENGTH;
    }
}