码迷,mamicode.com
首页 > 其他好文 > 详细

队列。

时间:2014-10-28 19:23:50      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   ar   sp   数据   div   on   

用模运算可简化为:i=(i+1)%MAX_QUEUE_SIZE ;

和时间有关的操作都与队列有关。

 

队列的顺序存储结构FIFO
设立一个队首指针front ,一个队尾指针rear ,分别指向队首和队尾元素。
◆ 初始化:front=rear=0。
◆ 入队:将新元素插入rear所指的位置,然后rear加1。
◆ 出队:删去front所指的元素,然后加1并返回被删元素。
◆ 队列为空:front=rear。
◆ 队满:rear=MAX_QUEUE_SIZE-1或front=rear。

 

静态顺序队列

#define MAX_QUEUE_SIZE 100
typedef struct queue
{
      ElemType Queue_array[MAX_QUEUE_SIZE] ;
      int front ;
      int rear ;
}SqQueue;

循环队列

循环队列需要的参数:2个参数。front rear
初始化:front 和rear的值都是0
队列非空:front代表的是队列的第一个元素
rear代表队列的最后一个有效元素的下一个元素。
队列空:front和rear的值都相等,但不一定是0.
◆ rear所指的单元始终为空。
◆ 循环队列为空:front=rear 。
◆ 循环队列满:(rear+1)%MAX_QUEUE_SIZE =front。

循环队列的初始化

 SqQueue Init_CirQueue(void)
{  
    SqQueue  Q ;
    Q.front=Q.rear=0;  
    return(Q) ;
}

入队操作
伪算法:将值放在r所代表的位置/r指针移动,r=(r+1)%数组的长度

Status Insert_CirQueue(SqQueue  Q , ElemType  e)                             
{  
    if  ((Q.rear+1)%MAX_QUEUE_SIZE== Q.front)    
        return  ERROR;                          
    Q.Queue_array[Q.rear]=e ;                      
    Q.rear=(Q.rear+1)% MAX_QUEUE_SIZE ;            
    return OK;       
}

出队

f=(f+1)%数组的长度

Status Delete_CirQueue(SqQueue  Q, ElemType  *x ) /*  将循环队列Q的队首元素出队  */  
{   
    if  (Q.front+1== Q.rear)
    return ERROR ;       /*  队空,返回错误标志    */
    *x=Q.Queue_array[Q.front] ;  /* 取队首元素 */
    Q.front=(Q.front+1)% MAX_QUEUE_SIZE ; /*  队首指针向前移动  */    
    return OK ;
}

 

队列的链式表示和实现---它是限制仅在表头进行删除操作和表尾进行插入操作的单链表。

数据元素结点类型定义:

typedef struct Qnode
{ 
    ElemType    data ;
    struct Qnode  *next ;
}QNode ;

指针结点类型定义:

typedef struct link_queue
{  
    QNode  *front ,  *rear ;
}Link_Queue ;

⑴ 链队列的初始化

LinkQueue *Init_LinkQueue(void)
{  
    LinkQueue  *Q ;  QNode  *p ;
    p=(QNode *)malloc(sizeof(QNode)) ; /* 开辟头结点 */
    p->next=NULL ;
    Q=(LinkQueue  *)malloc(sizeof(LinkQueue)) ;  /*  开辟链队的指针结点  */       
    Q.front=Q.rear=p ; 
    return(Q) ;
}

(2) 链队列的入队操作---在已知队列的队尾插入一个元素e ,即修改队尾指针(Q.rear)。

Status  Insert_CirQueue(LinkQueue  *Q , ElemType  e) /*  将数据元素e插入到链队列Q的队尾  */     
{   
    p=(QNode *)malloc(sizeof(QNode)) ;
    if (!p)  
        return  ERROR;/*  申请新结点失败,返回错误标志 */
    p->data=e ;
    p->next=NULL ;       /*  形成新结点 */
    Q.rear->next=p ; 
    Q.rear=p ;  /*  新结点插入到队尾  */
    return OK;
}

(3)链队列的出队操作

Status  Delete_LinkQueue(LinkQueue  *Q, ElemType *x)
{   
    QNode *p ;
    if(Q.front==Q.rear)  
        return ERROR ;    /*  队空  */
    p=Q.front->next ;   /*  取队首结点  */
    *x=p->data ; 
    Q.front->next=p->next ;      /*  修改队首指针  */
    if (p==Q.rear)  Q.rear=Q.front ;  /*  当队列只有一个结点时应防止丢失队尾指针  */   
        free(p) ;   
    return OK ; 
}

(4)链队列的撤消

void  Destroy_LinkQueue(LinkQueue  *Q ) /*  将链队列Q的队首元素出队  */  
{  
    while(Q.front!=NULL)
    { 
        Q.rear=Q.front->next;    /*  令尾指针指向队列的第一个结点   */         
        free(Q.front);      /*  每次释放一个结点  */ /*  第一次是头结点,以后是元素结点  */        
        Q.ront=Q.rear;
}

 

队列。

标签:des   style   blog   color   ar   sp   数据   div   on   

原文地址:http://www.cnblogs.com/lcpholdon/p/4057279.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!