五.我遇到了循环队列,忍不住对它进行了一番解剖
循环队列是什么?
就是一个将自己的尾指针指向的位置为自己的头指针元素,就是将自己的要插入的元素放在了对列的首部。
为什么要有循坏对列?
在一个队列指针中,随着数据的插入,在尾指针上面的进行入栈操作,同时对于新元素的删除,对头指针指向的队列元素进行出栈操作,这样就是的队列的动使得这个尾指针达到Q->rear==MAXSIZE上时,这个函数将无法入栈,同时用代码实现只是说是栈满退出,其实这个是假栈满,我们将这样的现象我们称为“假溢出”现象。
于是我们就需要将自己的尾指针指向的位置为自己的头指针元素,就是将自己的要插入的元素放在了对列的首部进行操作,为什么需要这样呢?其实解决这样“假溢出”的情况我可以总结为两点:(1).是利用队列元素的平移,判断位置的空来将这个位置,这个操作我觉得是你输入的数(假设为n)在这个队列上循环遍历n*(MAXSIZS-N)个次数。
显然易见,采用这个循环队列上解决了这个“假溢出”问题,因为队列上真正实用的顺序队列是循环对列,但是又会遇到问题是由于入队时尾指针向前追赶头指针,出队是头指针向前追赶尾指针,故队空和队满的头尾指针均相等,我们没有办法实现front=rear来判断队列的空和满

我们用图来演示:




为了右效地区分队列满还是空,比较典型的有如下三种:
(1)多设一个逻辑变量存放队列满还是空。
(2)多使用一个整型变量做计数器来记录队列中元素的总数(即队列长度)。
(3)少用一个元妻的空间,约定人队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队消(注意:rear所指的单元始终为空)。
为了解决这一向题我们在本教材里采用第三种方法,即规定循环队列中始终留一个空的元素空间,就是我们设计的尾指针rear永远没有元素。我们称这种方法为“队尾立SnQueoe + Q
上队首即为队列满”。因此循环队列的空与满状态的判定可描述如下:
①队空:Q-rear==Q->front
②队满:cQ->rear+I)% QUEUESIZE--Q->front。
一:队列的初始化
`SqQueue* InitSqQueue() {
SqQueue* Q;
Q = (SqQueue*)malloc(sizeof(SqQueue));
if (!Q)
return NULL;
else
{
Q->front = Q->rear = 0;
return Q;
}
}
`
2.循环队列的插入运算
int Push(SqStack* S, ElamType x) { if (S->top == STACKSIZE - 1){ printf("空间已满,无法压栈"); return ERROR; } else { S->top++; S->data1[S->top] = x; return OK; } }
3.循环队列的出队运算
int Pop(SqStack* S, ElamType *x) { if (S->top == STACKSIZE - 1) { printf("空间空,无法删除"); return ERROR; } *x = S->data1[S->top]; S->top--; return OK; }

浙公网安备 33010602011771号