循环队列的元素倒置。求指点。
本帖最后由 whdugh 于 2013-01-30 12:29:48 编辑 编写一个算法,将一个循环队列(容量为n,元素下标从1~n)的元素倒置。
/*
算法思想: 使用一个栈起到过渡作用。先将sq队列中元素出队并将其入栈ss,直到队列空为止;
然后初始化队列,将sq->front=sq->rear=n;再出栈并将其入队列,直到栈空为止。
*/void Reverse(SqQuene *sq)
{
ELEMTYPE x;
SqStack *ss;
ss = (SqStack *)malloc(sizeof(SqStack)); //栈初始化
ss->top = -1;
while(sq->front != sq->rear) //队不空时,出队并入栈
{
sq->front = (sq->front + 1) % MAXSIZE;
if(sq->front == 0) //队列元素下标从1到n
sq->front = n; //dgh n 这里是什么意思 front和rear 指向的位置变化了?
x = sq->data[sq->front];
ss->top++;
ss->data[ss->top] = x; //将x入栈
} /*sq栈中从栈顶到栈底的元素为f,e,d,c,b,a*/
sq->front = sq->rear = n; /*队列初始化 为何初始化为n*/ ?
while(ss->top >= 0) /*栈不空时,出栈并将元素入队 */
{
x = ss->data[ss->top];
ss->top--;
sq->rear = (sq->rear + 1) % n;
sq->data[sq->rear] = x;
}
}
/*
算法思想: 使用一个栈起到过渡作用。先将sq队列中元素出队并将其入栈ss,直到队列空为止;
然后初始化队列,将sq->front=sq->rear=n;再出栈并将其入队列,直到栈空为止。
*/void Reverse(SqQuene *sq)
{
ELEMTYPE x;
SqStack *ss;
ss = (SqStack *)malloc(sizeof(SqStack)); //栈初始化
ss->top = -1;
sq ->front = 0;
sq->rear = n; //如果程序外已经满足次条件,这两句也可以省去
while(sq->front != sq->rear) //队不空时,出队并入栈
{
sq->front = (sq->front + 1) % MAXSIZE;
if(sq->front == 0) //队列元素下标从1到n
sq->front = n;
x = sq->data[sq->front];
ss->top++;
ss->data[ss->top] = x; //将x入栈
} /*sq栈中从栈顶到栈底的元素为f,e,d,c,b,a*/
//这里删除了一句
while(ss->top >= 0) /*栈不空时,出栈并将元素入队 */
{
x = ss->data[ss->top];
ss->top--;
sq->rear = (sq->rear + 1) % n;
sq->data[sq->rear] = x;
}
}