设为首页 加入收藏

TOP

静态循环队列的相关操作及详解 (二)
2014-11-23 22:04:07 来源: 作者: 【 】 浏览:4
Tags:静态 循环 队列 相关 操作 详解
eue(QUEUE *);//判断循环队列是否已满 bool del_queue(QUEUE *,int *);//出队 bool empty_queue(QUEUE *);//判断循环队列是否为空 bool traverse_queue(QUEUE *);//遍历输出 int length(QUEUE *);//求循环队列的长度 int main() { QUEUE Q; int val; init(&Q); en_queue(&Q,1); en_queue(&Q,2); en_queue(&Q,3); en_queue(&Q,4); traverse_queue(&Q); if(del_queue(&Q,&val)) printf("出队成功,出队元素的值为:%d\n",val); else printf("出队失败!"); traverse_queue(&Q); printf("队列的长度为:%d\n",length(&Q)); return 0; } void init(QUEUE *pQ) { pQ->pBase=(int *)malloc(sizeof(int)*5);//造数组,设其数组长度为n=5(规定当数组中有n-1个元素时已满),初始化时使Queue的成员front、rear的值都为0 if(NULL==pQ->pBase) { printf("动态内存分配失败!\n"); exit(-1); } pQ->front=0; pQ->rear=0; } bool full_queue(QUEUE *pQ) { if((pQ->rear+1)%5==pQ->front) return true; else return false; } bool en_queue(QUEUE *pQ,int val) { if(full_queue(pQ)) { printf("队列已满,入队失败!\n"); return false; } pQ->pBase[pQ->rear]=val; pQ->rear=(pQ->rear+1)%5;//队尾加1 return true; } bool del_queue(QUEUE *pQ,int *pVal) { if(empty_queue(pQ)) return false; *pVal=pQ->pBase[pQ->front]; pQ->front=(pQ->front+1)%5; return true; } bool empty_queue(QUEUE *pQ) { if(pQ->rear==pQ->front)//因为队列不为空时,rear和front肯定不相等 return true; else return false; } bool traverse_queue(QUEUE *pQ) { int i=pQ->front; if(empty_queue(pQ)) { printf("队列为空,遍历失败!\n"); return false; } printf("队列元素有:"); while(i!=pQ->rear) { printf("%d ",pQ->pBase[i]); i=(i+1)%5; } printf("\n"); return true; } int length(QUEUE *pQ) { int len=0; int i=pQ->front;; if(empty_queue(pQ)) return 0;//队列为空,长度为0 while(i!=pQ->rear) { i=(i+1)%5; ++len; } return len; }

注意

1.指针只在入队和出队时移动,其它情况下不能移动。

2.队列初始化:front和rear的值都是零;

3.队列非空:front代表的是队列的第一个元素,rear代表的是队列的最后一个有效元素的下一个元素。

4.顺序队列和循环队列最直观的区别就是:循环队列首尾相连形成一个圆环,而顺序队列不成环状(通常会造成内存资源的浪费)。

5.队列的应用非常广泛,所有与时间有关的操作都可以用到队列。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言打印模式匹配的行练习 下一篇通过qsort(void * lineptr[], in..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: