数据结构(三)——队列及实现、循环队列实现
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前面的时候就是满了,如图:
![](http://hi.csdn.net/attachment/201109/17/0_131625055155zP.gif)
当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;
}
}
一、队列 队列是一种特殊的线性表,它只允许在表的前端(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前面的时候就是满了,如图:
![](http://hi.csdn.net/attachment/201109/17/0_131625055155zP.gif)
当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;
}
}
相关文章推荐
- 简单数据结构的实现之循环队列
- 数据结构实现循环队列的两种方法
- 数据结构:循环队列(C语言实现)
- 数据结构:循环队列(C语言实现)
- 数据结构(java语言描述)-- 队列的循环数组实现
- 循环队列–C语言实现–数据结构
- 数据结构:循环队列(C语言实现)
- 数据结构学习之循环队列c++实现
- 数据结构-循环队列的基本实现操作
- 数据结构(C实现)------- 顺序队列(循环队列之计数器实现)
- [数据结构]队列实现、循环队列的不同实现
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
- 数据结构之循环队列的实现
- 基本数据结构,循环队列的顺序实现。
- 循环队列实现杨辉三角及数据结构
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
- 数据结构循环队列——数组模拟实现
- 数据结构学习----顺序循环队列(Java实现)
- 【自己动手写数据结构】 -- 循环队列的表示与实现
- 数据结构学习之循环队列的另一种c++实现