顺序队列
2015-10-13 16:16
197 查看
队列
队列和栈一样,都是一种线性结构,,它们都是操作受限制的线性表,其特殊性在于限制线性表的插入与删除等操作的位置。
定义:
队列是一种特殊的线性表,它包含一个对头(front)和一个队尾(rear)。其中,队头只允许删除元素,队尾只允许插入元素。特点是先进先出(FIFO)。
抽象数据类型
1:数据对象集合
队列的数据对象集合为{a1,a2,……an},每个元素的的类型都是DataType。队列也是一种线性表。
2:基本操作集合
(1):InitQueue(&Q):初始化操作。建立一个空队列Q。
(2):QueueEmpty(Q):若队列为空,返回1,否则,返回0
(3):EnterQueue(&Q,X):插入元素X到队列Q队尾中
(4):DeleteQueue(&Q,&e):删除元素队列Q队首,并用e返回其值。
(5):Gethead(Q,&e):用e返回Q的队首元素。
(6):ClearQueue(&Q):将队列Q清空。
队列的顺序存储
顺序队列通常采用一位数组进行存储。连续的存储单元依次存放在队列中的元素。同时,使用2个指针分别表示数组中存放的第一个元素和最后一个元素的位置。
其中,指向第一个元素的位置的指针为队头指针front,指向最后一个元素的位置的指针为队尾指针rear。
用c语言描述如下
#define QueueSize 40 //队列的容量
typedef struct Squeue{
DataTypequeue[QueueSize];
Intfront,rear; //队头和队尾
}
顺序队列的实现
为了方便c语言的表示,我们约定:初始化建立空队列时,front = rear = 0;队头指针和队尾指针指向队列的第一个位置。插入新元素时
队尾指针rear 加1,删除元素时,队头指针front加1。队列非空时,队头指针front 指向队头元素的位置,队尾指针rear指向队尾元素所在位置的下一个位置。
(1):队列的初始化操作
(2):判断队列是否为空
(3):入队操作
(4):出队操作
(6):将队列清空操作
实例:
编程实现顺序队列的入队和出队操作,将结果输出。
队列和栈一样,都是一种线性结构,,它们都是操作受限制的线性表,其特殊性在于限制线性表的插入与删除等操作的位置。
定义:
队列是一种特殊的线性表,它包含一个对头(front)和一个队尾(rear)。其中,队头只允许删除元素,队尾只允许插入元素。特点是先进先出(FIFO)。
抽象数据类型
1:数据对象集合
队列的数据对象集合为{a1,a2,……an},每个元素的的类型都是DataType。队列也是一种线性表。
2:基本操作集合
(1):InitQueue(&Q):初始化操作。建立一个空队列Q。
(2):QueueEmpty(Q):若队列为空,返回1,否则,返回0
(3):EnterQueue(&Q,X):插入元素X到队列Q队尾中
(4):DeleteQueue(&Q,&e):删除元素队列Q队首,并用e返回其值。
(5):Gethead(Q,&e):用e返回Q的队首元素。
(6):ClearQueue(&Q):将队列Q清空。
队列的顺序存储
顺序队列通常采用一位数组进行存储。连续的存储单元依次存放在队列中的元素。同时,使用2个指针分别表示数组中存放的第一个元素和最后一个元素的位置。
其中,指向第一个元素的位置的指针为队头指针front,指向最后一个元素的位置的指针为队尾指针rear。
用c语言描述如下
#define QueueSize 40 //队列的容量
typedef struct Squeue{
DataTypequeue[QueueSize];
Intfront,rear; //队头和队尾
}
顺序队列的实现
为了方便c语言的表示,我们约定:初始化建立空队列时,front = rear = 0;队头指针和队尾指针指向队列的第一个位置。插入新元素时
队尾指针rear 加1,删除元素时,队头指针front加1。队列非空时,队头指针front 指向队头元素的位置,队尾指针rear指向队尾元素所在位置的下一个位置。
(1):队列的初始化操作
//队列的初始化操作 void InitQueue(SeqQueue *SQ) { SQ->front = SQ->rear = 0; //把队头的指针和队尾的指针设为0 }
(2):判断队列是否为空
//判断队列是否为空,是则返回1,否则返回0 int QueueEmpty(SeqQueue SQ) { if(SQ.front == SQ.rear) //判断队头的指针是否和队尾的一样 return 1; else return 0; }
(3):入队操作
//入队操作,将元素x插入队尾,成功返回1,失败返回0 int EnterQueue(SeqQueue *SQ,DataType x) { if(SQ->rear == QueueSize) //插入元素前检查队列是否已满 return 0; SQ->queue[SQ->rear] = x; //在队尾插入元素 SQ->rear = SQ->rear + 1; //将队尾指针后移一位 return 1; }
(4):出队操作
//出队操作 int DeleteQueue(SeqQueue *SQ,DataType *e) { if(SQ->front == SQ->rear) //删除元素前检查队列是否已空 return 0; else { *e = SQ->queue[SQ->front]; //将删除的元素付给e SQ->front = SQ->front + 1; //将队头指针后移一位 return 1; } }(5):取头元素操作
//用e返回队头元素 int GetHead(SeqQueue SQ,DataType *e) { if(SQ.front == SQ.rear) //删除元素前检查队列是否已空 return 0; else { *e = SQ.queue[SQ.front]; //用e返回队头元素 return 1; } }
(6):将队列清空操作
//清空队列 void ClearQueue(SeqQueue *SQ) { SQ->front = SQ->rear = 0; }
实例:
编程实现顺序队列的入队和出队操作,将结果输出。
#include <stdio.h> #include "SeqQueue.h" void main() { SeqQueue Q; //声明一个顺序队列Q char str[] = "ABCDEFG"; int i,length = 7; DataType x; InitQueue(&Q); //初始化顺序队列 for(i=0; i<length; i++ ) { EnterQueue(&Q,str[i]); } DeleteQueue(&Q,&x); //将队头元素出队列 printf("出队列的元素是:%c\n",x); printf("顺序队列的元素为:"); if(!QueueEmpty(Q)) //判断顺序表是否为空 { for(i=Q.front; i<Q.rear; i++) printf("%c",Q.queue[i]); //输出队头指针到队尾指针的元素 } printf("\n"); }
相关文章推荐
- 我是运营,我没有假期
- 注册表的组织结构
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- 修复mysql数据库
- SQLSERVER的非聚集索引结构深度理解
- SQLServer 数据导入导出的几种方法小结
- 调整SQLServer2000运行中数据库结构
- MySQL数据备份之mysqldump的使用详解
- C#基础语法:结构和类区别详解
- 深入c# 类和结构的区别总结详解
- c#结构和类的相关介绍
- C#实现窗体间传递数据实例
- C#中结构(struct)的部分初始化和完全初始化实例分析
- C#线程队列用法实例分析
- C#中类与结构的区别实例分析
- C#枚举类型与结构类型实例解析
- 给你的数据库文件减肥
- Oracle数据更改后出错的解决方法