您的位置:首页 > 理论基础 > 数据结构算法

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

2018-03-20 14:14 459 查看
http://blog.csdn.net/fansongy/article/details/6784954
一、队列    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。  
二、操作和实现1、结构体定义2、初始化3、判断是否为空4、取得队列的首节点值5、入队列操作6、出队列操作7、打印队列的内容 1、结构体定义[cpp] view plain copy#define LENGTH 100  
typedef char datatype;  
  
typedef struct queue{  
    datatype data[LENGTH];  
    int front;  
    int rear;  
}sequence_queue;  

2、初始化[cpp] view plain copy#include"queue.h"  
  
void init_sequence_queue(sequence_queue *sq){  
    sq->front = 0;  
    sq->rear = 0;  
}  
 3、判断是否为空[cpp] view plain copy#include"queue.h"  
  
bool is_empty_sequence_queue(sequence_queue *sq){  
    return (sq->front == sq->rear ? true:false);  
}  

4、取得队列的首节点值[cpp] view plain copy#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、入队列操作[cpp] view plain copy#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、出队列操作[cpp] view plain copy#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、打印队列的内容[cpp] view plain copy#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、入队列操作[cpp] view plain copy#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、出队列操作[cpp] view plain copy#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、打印队列的内容[cpp] view plain copy#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;  
    }  
}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: