队列及实现、循环队列实现

 

一、队列

    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。  

二、操作和实现

1、结构体定义

2、初始化

3、判断是否为空

4、取得队列的首节点值

5、入队列操作

6、出队列操作

7、打印队列的内容

 

1、结构体定义

[cpp]   view plain copy print ?
  1. #define LENGTH 100  
  2. typedef char datatype;  
  3.   
  4. typedef struct queue{  
  5.     datatype data[LENGTH];  
  6.     int front;  
  7.     int rear;  
  8. }sequence_queue;  


2、初始化

[cpp]   view plain copy print ?
  1. #include"queue.h"  
  2.   
  3. void init_sequence_queue(sequence_queue *sq){  
  4.     sq->front = 0;  
  5.     sq->rear = 0;  
  6. }  

 

3、判断是否为空

[cpp]   view plain copy print ?
  1. #include"queue.h"  
  2.   
  3. void is_empty_sequence_queue(sequence_queue *sq){  
  4.     return (sq->front == sq->rear ? 1:0);  
  5. }  


4、取得队列的首节点值

[cpp]   view plain copy print ?
  1. #include"queue.h"  
  2.   
  3. datatype get_head(seqence_queue *sq){  
  4.     if(sq->front == sq->rear){  
  5.         printf("the queue is empty!\n");  
  6.         exit(1);  
  7.     }  
  8.     return sq->data[sq->front];   
  9. }  


5、入队列操作

[cpp]   view plain copy print ?
  1. #include"queue.h"  
  2.   
  3. void insert_sequence_queue(sequence_queue *sq,datatype data){  
  4.     if(sq->rear == LENGTH){  
  5.         printf("the queue is full\n");  
  6.         exit(1);  
  7.     }  
  8.     sq->data[sq->rear] = data;  
  9.     sq->rear++;  
  10. }  


6、出队列操作

[cpp]   view plain copy print ?
  1. #include"queue.h"  
  2.   
  3. datatype delete_sequence_queue(sequence_queue *sq){  
  4.     if(sq->rear == sq->front){  
  5.         printf("the queue is empty!\n");  
  6.         exit(1);  
  7.     }     
  8.     sq->front++;  
  9.     return sq->data[sq->front-1];  
  10. }  


 

7、打印队列的内容

[cpp]   view plain copy print ?
  1. #include"queue.h"  
  2.   
  3. void display_sequence_queue(sequence_queue *sq){  
  4.     if(sq->front == sq->rear){  
  5.         printf("the queue is empty!\n");  
  6.         exit(1);  
  7.     }     
  8.     int i ;  
  9.     for(i = sq->front;i<sq->rear;i++){  
  10.         priintf("%c ",sq->data[i]);  
  11.     }  
  12. }  


 

三、循环队列

    由于队列有元素出列,front就向后移动,所以队列前面的空间就空了出来。为了更合理的利用空间,人们想了一个办法:将队列的首尾相连接。这样当rear移动到LENGTH时,会再从0开始循环。那当什么时候队列满呢?当rear等于front的时候。可是队列为空的时候也是同样的条件,那不就没法判断了吗?又有人提出了这样的想法:牺牲一个存储空间,front前面不存数据,当rear在front前面的时候就是满了,如图:

 

 

    当rear在front之前时,队列中剩余一个空间,有 LENGTH - 1个元素,所以rear也为LENGTH - 1。这时就算是队列满了。于是

    满的判断条件应为:(rear+1)%LENGTH == front 。

    空的判断条件为 rear == front。

 

所以一些操作有些变化: 

5、入队列操作

[cpp]   view plain copy print ?
  1. #include"queue.h"  
  2.   
  3. void insert_sequence_queue(sequence_queue *sq,datatype data){  
  4.     if((sq->rear+1)%LENGTH == sq->front){  
  5.         printf("the queue is full\n");  
  6.         exit(1);  
  7.     }  
  8.     sq->data[sq->rear] = data;  
  9.     sq->rear= (sq->rear+1)%LENGTH;  
  10. }  


6、出队列操作

[cpp]   view plain copy print ?
  1. #include"queue.h"  
  2.   
  3. datatype delete_sequence_queue(sequence_queue *sq){  
  4.     if(sq->rear == sq->front){  
  5.         printf("the queue is empty!\n");  
  6.         exit(1);  
  7.     }    
  8.     if(sq->front+1 == LENGTH){  
  9.         sq->front = (sq->front+1)%LENGTH;       //其实就是0       
  10.         return sq->data[LENGTH-1];  
  11.     }          
  12.     sq->front++;  
  13.     return sq->data[sq->front-1];  
  14. }  


 

7、打印队列的内容

[cpp]   view plain copy print ?
  1. #include"queue.h"  
  2.   
  3. void display_sequence_queue(sequence_queue *sq){  
  4.     if(sq->front == sq->rear){  
  5.         printf("the queue is empty!\n");  
  6.         exit(1);  
  7.     }     
  8.     int i ;  
  9.     for(i=sq->front;i!=sq->rear;){  
  10.         printf("%c ",sq->data[i]);              
  11.         i=(i+1)%LENGTH;  
  12.     }  
  13. }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值