循环队列(C语言版)

 线性结构的主要操作就是插入和删除,我 们前面讲过的顺序线性表、单链表、双链表都没有限制插入和删除操作的位置。如果我们限定插入和删除操作在线性表的同一端进行那么这种结构就是栈;如果限定 插入在一端而删除在另一端,这种结构就是对列;栈的特点是先进后出(FILO)而对列是先进先出(FIFO)。进行插入的一端叫队尾,删除的一端叫队头。
    队列的实现可以用顺序线性表也可以用链表。在实际使用中有一种更常用的队列叫循环队列。循环队列是把队列的头和尾在逻辑上连接起来,构成一个环。循环队列 中首尾相连,分不清头和尾,此时需要两个指示器分别指向头部和尾部。插入就在尾部指示器的指示位置处插入,删除就在头部指示器的指示位置删除。
    循环队列在插入时也要判断其是否已满,删除时要判断其是否已空。为空的条件比较简单当头部指示器和尾部指示器指向同一个位置时表示循环队列为空;因为尾部 指示器指示的是最后一个元素的下一个位置,所以循环队列已满时头部指示器和尾部指示器也指向同一个位置,为了区分这两种状况有两种方法,一种增加一个标识 变量来区分,另一种损失循环队列中的一个元素,即头和尾之间的位置不用,此时循环队列为满的条件变成头部指示器加1等于尾部指示器;为空的条件成为头部指 示器和尾部指示器指向同一位置。
   循环队列的首尾相连是通过取余操作来实现的,把头和尾的位置都除以队列最大长度然后取余。当到达尾部及最后一个位置时再加1就成了队列的长度刚好可以整除余0即又回到了队头。
   循环队列的主要操作:
   (1)创建循环队列
   (2)初始化循环队列
   (3)判断循环队列是否为空
   (4)判断循环队列是否为满
   (5)入队
   (6)出队
  Microsoft Visual Studio .NET 2003下的程序:

C代码   收藏代码
  1.     #include<stdio.h>  
  2.   
  3. #define MAXSIZE 100  
  4. typedef struct  
  5. {  
  6. int elem[MAXSIZE];  
  7. int front,rear;  
  8. }Quque; //定义队头  
  9.   
  10. int initQue(Quque **q) //初始化  
  11. {  
  12. (*q)->front=0;  
  13. (*q)->rear=0;  
  14. }  
  15.   
  16. int isFull(Quque *q)  
  17. {  
  18. if(q->front==(q->rear+1)%MAXSIZE) //判满 刘勉刚  
  19. return 1;  
  20. else  
  21. return 0;  
  22. }  
  23. int insertQue(Quque **q,int elem)  
  24. {  
  25. if(isFull(*q)) return -1;  
  26. (*q)->elem[(*q)->rear]=elem;  
  27. (*q)->rear=((*q)->rear+1)%MAXSIZE; //插入  
  28. return 0;  
  29. }  
  30. int isEmpty(Quque *q)  
  31. {  
  32. if(q->front==q->rear) //判空  
  33. return 1;  
  34. else  
  35. return 0;  
  36. }  
  37. int deleteQue(Quque ** q,int *pelem)  
  38. {  
  39. if(isEmpty(*q))  
  40. return 0;  
  41. *pelem=(*q)->elem[(*q)->front];  
  42. (*q)->front =((*q)->front +1)%MAXSIZE;  
  43. return 0;  
  44. }  
  45.   
  46. int main(void)  
  47. {  
  48. int i=0,elem;  
  49. Quque *q=(Quque *)malloc(sizeof(Quque));  
  50. initQue(&q);  
  51. for(;i<10;i++)  
  52. {  
  53. insertQue(&q,i);  
  54. }  
  55. for(i=0;i<10;i++)  
  56. {  
  57. deleteQue(&q,&elem);  
  58. printf("%d\n",elem);  
  59. }  
  60. system("pause");  
  61. return 0;  
  62. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值