Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28190
  • 博文数量: 8
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-08 15:28
个人简介

擅长linux应用及驱动开发!

文章分类
文章存档

2014年(7)

2013年(1)

我的朋友

分类: C/C++

2014-06-24 11:08:41

 循环队列的实现

在队列中也可以使用连续的内存空间存放队列元素,附设两个指针分别指向对头和队尾,初始化两个指针为0,当有元素进队时对为指针加1,有元素出对时队尾指针加1。但这样的话会有问题,就是出队列留下的地址空间就不会被利用了,且当开始分配的空间使用完时还会不停的申请空间,浪费了很对空间。若固定的空间的话队尾指针到了末尾就无法在添加元素了,而此时出队列留下的地址处还有空间无法使用。一个较好的办法是将对列构想成一个环形队列,当队尾指针到队列最后是又重最开始处使用空间,且规定队列头指针在队尾指针的下一个位置作为队列满的标志。可见队列顺序存储不能动态分配空间,需要在开始分配一个较大的空间,若无法估计队列长度,最好使用链式存储。

  • 循环队列存储结构


  1. #define OK          1  
  2. #define NULL_QUEUE      0  
  3. #define ERROR           -1  
  4.   
  5. typedef struct qnode{  
  6.     elemtype        *base;  
  7.     int         front;  
  8.     int         rear;  
  9. }sqqueue;  


  • 初始化循环队列
  1. int init_sqqueue(sqqueue *sq)  
  2. {  
  3.     sq->base = (elemtype *)malloc(MAXQSIZE * sizeof(elemtype));  
  4.     if (!sq->base)  
  5.         return ERROR;  
  6.   
  7.     sq->front = 0;  
  8.     sq->rear = 0;  
  9.   
  10.     return OK;  
  11. }  
初始化时分配MAXQSIZE个元素的空间,队头和队尾下标初始化为0;
  • 元素进队列
  1. int in_sqqueue(sqqueue *sq, elemtype e)  
  2. {  
  3.     if ((sq->rear + 1) % MAXQSIZE == sq->front)  
  4.         return ERROR;  
  5.     sq->base[sq->rear] = e;  
  6.     sq->rear = (sq->rear + 1) % MAXQSIZE;  
  7.     return OK;  
  8. }  
  • 元素出队列
  1. int out_sqqueue(sqqueue *sq, elemtype *e)  
  2. {  
  3.     if (sq->front == sq->rear)  
  4.         return NULL_QUEUE;  
  5.   
  6.     *e = sq->base[sq->front];  
  7.     sq->front = (sq->front + 1) % MAXQSIZE;  
  8.   
  9.     return OK;  
  10. }  
  • 取得队列长度
  1. int get_queue_len(sqqueue sq)  
  2. {  
  3.     return (sq.rear-sq.front + MAXQSIZE) % MAXQSIZE;  
  4. }  
阅读(745) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~