队列是一种受限制的线性表。
日常生活中的排队: 入队 出对
队列:受操作约束的线性表。
和堆栈相比堆栈只能在一段插入,删除。
然而队列实在分别得两端进行插入和删除。
先进来先服务
先进先出(First in first out)、(FIFO)。
类型名称:队列(Queue)
数据对象集:一个有0个或者多个元素的有穷线性表。
操作集:长度为MaxSize的队列Q∈Queue,队列元素item∈ElementType。
1,Queue CreatQueue(int MaxSize):生成长度为MaxSize的空队列。
2,int IsFullQ(Queue Q,int MaxSize);判断队列是否已满。
3,void AddQ(Queue Q,ElementType item);将数据元素item插入到队列Q中。
4,int IsEmptyQ(Queue Q);判断队列是否为空。
5,、ElementType DeleteQ(Queue Q);将队列火速据中的元素从队列中删除并返回。
队列的储存实现
1:顺序存储:
队列的顺序存储结构通常由一个一维数组和一个记录队列头元素的位置的变量front以及一个记录队尾元素未知的变量rear组成
#defined MaxSize<储存数据元素的最大个数>
typedef tsruct
{
ElementType Date[MaxSize];
int rear; //尾元素。
int front; //首元素。
}Queue;
下面开始一维数组储存队列
蛋疼的事经过一系列操作,现在明明有位置但是放不进去人了。怎么办呢?。。。。。。。。
现在就解决了,上一个问题。队列弯了之后就能继续储存了。哈哈。但是完成了么?。。。。。。
以前我们判别堆栈满的情况是看rear和front是否相等,判断数据个数是通过他们的差值但是,为什么总是有一个空位不能用呢?why?
原因就是如果用rear和front 的差值来表示的话,只有n-1种情况。想用n-1中情况来表示n中状态。明显是扯淡。
解决方法有两种
1:就用n-1个空间
2:使用额外标记:size或者tag。
男生的话就应该大气一点,大不了就用n-1个空间。 下面附上代码
/*入队列*/ void AddQ(Queue *PtrQ,ElementType item) //将iten 这个元素加入 *PtrQ 这个队列里面去 { if((PtrQ->rear+1)%MaxSzie==PtrQ->front)//动动脑子就有了。 //判断队列是否已满 { printf("队列满 "); } else //没有满的话 { PtrQ->rear=(PtrQ->rear+1)%MaxSize; // 找到他要去的地方 PtrQ->Date[PtrQ->rear]=item; //找到地方了,开始在哪里赋值。 } }
-----------------下面再附上出队列。。---------------
ElementType DeleteQ(Queue *PtrQ) //返回的类型是 ElementType 传送一个队列 { if(PtrQ->rear==PtrQ->front) //判断队列是否为空。 { printf("队列空 "); return error ; } else //不为空的话。 { PtrQ->front=(PtrQ->front+1)%MaxSize; return PtrQ->Date[PtrQ->front]; } }