
循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。使用求余运算可以判断队列是否已满。
代码
//circular Queue 循环队列实现 #include <stdlib.h>#include <stdio.h>#define MAXSIZE 100typedef int ElemType typedef struct { ElemType *base//存储内存分配基地址 int front //队列头索引 int rear //队列尾索引}circularQueue//初始化队列InitQueue(circularQueue *q){ q->base = (ElemType *)malloc((MAXSIZE) * sizeof(ElemType))if (!q->base) exit(0)q->front = q->rear = 0} //入队列 *** 作InsertQueue(circularQueue *q, ElemType e){ if ((q->rear + 1) % MAXSIZE == q->front) return//队列已满时,不执行入队 *** 作 q->base[q->rear] = e //将元素放入队列尾部 q->rear = (q->rear + 1) % MAXSIZE//尾部元素指向下一个空间位置,取模运算保证了索引不越界(余数一定小于除数)} //出队列 *** 作DeleteQueue(circularQueue *q, ElemType *e){ if (q->front == q->rear) return //空队列,直接返回 *e = q->base[q->front] //头部元素出队 q->front = (q->front + 1) % MAXSIZE}
更多信息可以参考《Linux就该这么学》
泻药。那来看下linux的实现好了。数据只能单向移动的意思是FIFO,于是linux中实际构建了一个循环队列。具体一点则是,申请一个缓冲区,作为pipe() *** 作中匿名管道文件实体,缓冲区设俩指针,一个读指针,一个写指针,并保证读指针向前移动不能超过写指针,否则唤醒写进程并睡眠,直到读满需要的字节数。同理写指针向前也不能超过读指针,否则唤醒读进程并睡眠,直到写满要求的字节数。pipe()返回的两个文件句柄最后指向的其实是一个inode,只不过一个是read only一个是write only.试想同时两个进程读[或者写,假设只有两个进程]的后果,由于i_count会等于2——如果小于2则说明两个进程同时关闭了写句柄,因此会直接退出读函数。此时俩进程会分别认为对方才是写者而反复醒来,反复监测,然并卵没有数据,于是反复睡眠。如果有多个进程,俩进程同时读[或者写],会造成数据混乱,因为读指针只有一个,而你不能保证读写的顺序。全双工指的是我读的时候可以写,写的时候还可以读,方法很简单,创建两条管道就可以了。欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)