简单数据结构—队列

      第一次发CSDN博客,有点小激动,因为自己看了不少CSDN里的大牛的博文,很崇拜。心想着什么时候自己也写一篇。现在是时候了。接触C语言有三年了,但是仅仅是皮毛,而且在学校也很少用,现在为做毕设,用到队列,发现已经忘得一干二净,于是重新翻书,写此算做笔记。内容如有不当还请诸位指出。 

      队列 是一种线性表,先进先出,准许插入的一端是队尾,准许删除的一端是队头。类似于排队购物,先来的先购买先离开,相当于对头。队列存储结构有两种:顺序存储和链式存储。现在只介绍顺序存储。

      顺序队列在存数之前先分配一块连续的内存单元(初始化大小)。有两个指针指示队列的两个位置。front指对头,rear指队尾(初始化为0)。插入元素时rear加1,指到下个位置。有元素出队时,point加1。

      顺序队列会出现“假溢出”,提出顺序循环队列。有两种解决方法。参考博文(后面提到)中提到一种,现在说另一种:增加一个标志位,设置一个标志位flag,初始队列为空时flag=0;当元素入队后若front==rear,flag置1;当出队成功若front==rear,则flag置0;所以,队列为空的判断条件是front==rear&&flag==0;队列为满的判断条件是front==rear&&flag==1;

现在贴出这种方法的入队和出队操作c语言实现。

int EnQueue(queue *q,int *x)          //入队

if(q->rear==q->front && q->flag==1)//表示队列已满 
return 0; 
else 

q->queue[q->rear]=x;    //
q->rear=(q->rear+1); //尾指针向后走一步 
  if(q->rear==q->front) //若有元素入队以后出现q->rear==q->front,则表示队列满 
q->flag=1; 
return 1; 

}

int DeQueue(queue *q,int *y)                  //出队

if(q->rear==q->front && q->flag==0)//表示队空 
    return 0; 
else 

*y=q->queue[q->front];    //将队头元素的值赋值为
q->front=(q->front+1);//头指针向后走一步 
if(q->rear==q->front) //若有元素出队以后出现q->rear==q->front,则表示队列空 
q->flag=0; 
return 1; 

}   

     这里只是文字解释,没能附相关图片演示,未涉及到的点或有不解

     请看http://blog.csdn.net/wtfmonking/article/details/16989159

你可能感兴趣的:(队列)