将打印队列的迭代函数转换为递归函数时出现问题
Problem while transforming an iterative function that prints a Queue into a recursive one
我有这个显示队列的迭代函数:
void displayQueue(queue *Q){
int temp;
while(!isEmpty(Q)){
temp = dequeue(Q);
printf("%d -> ", temp);
displayQueue(Q);
enqueue(Q, temp);
}
reverse(Q);
}
我想通过删除 while 循环使其完全递归,这就是我到目前为止得到的:
void displayQueue(queue *Q){
if(isEmpty(Q)) return;
int temp = dequeue(Q);
printf("%d -> ", temp);
displayQueue(Q);
enqueue(Q, temp);
}
问题是什么时候调用"reverse(Q)"函数,这个函数必须在打印结束时调用,当函数returns但是那一刻Q是空的,所以它不会被反转(队列的打印导致其反转)
这是我的队列结构:
typedef struct queue{
unsigned capacity;
int size;
int front;
int rear;
int *array;
}queue;
函数看起来应该是这样的
void displayQueue( queue *Q )
{
if ( !isEmpty( Q ) )
{
int temp = dequeue( Q );
printf( "%d -> ", temp );
displayQueue( Q );
reverse( Q );
enqueue( Q, temp );
reverse( Q );
}
}
如果你想避免如此频繁地反转队列,那么你可以使用静态变量编写函数,例如
void displayQueue( queue *Q )
{
static int state = 0;
if ( !isEmpty( Q ) )
{
int to_reverse = state ^ 1;
if ( to_reverse ) state = to_reverse;
int temp = dequeue( Q );
printf( "%d -> ", temp );
displayQueue( Q );
enqueue( Q, temp );
if ( to_reverse )
{
reverse( Q );
state = 0;
}
}
}
如果没有静态变量,您可以编写将其拆分为两个函数的函数。第一个调用递归函数并反转结果。第二个是显示队列的递归函数。
例如
void recursiveDisplayQueue( queue *Q )
{
if ( !isEmpty( Q ) )
{
int temp = dequeue( Q );
printf( "%d -> ", temp );
recursiveDisplayQueue( Q );
enqueue( Q, temp );
}
}
void displayQueue( queue *Q )
{
if ( !isEmpty( Q ) )
{
recursiveDisplayQueue( Q );
reverse( Q );
}
}
我有这个显示队列的迭代函数:
void displayQueue(queue *Q){
int temp;
while(!isEmpty(Q)){
temp = dequeue(Q);
printf("%d -> ", temp);
displayQueue(Q);
enqueue(Q, temp);
}
reverse(Q);
}
我想通过删除 while 循环使其完全递归,这就是我到目前为止得到的:
void displayQueue(queue *Q){
if(isEmpty(Q)) return;
int temp = dequeue(Q);
printf("%d -> ", temp);
displayQueue(Q);
enqueue(Q, temp);
}
问题是什么时候调用"reverse(Q)"函数,这个函数必须在打印结束时调用,当函数returns但是那一刻Q是空的,所以它不会被反转(队列的打印导致其反转)
这是我的队列结构:
typedef struct queue{
unsigned capacity;
int size;
int front;
int rear;
int *array;
}queue;
函数看起来应该是这样的
void displayQueue( queue *Q )
{
if ( !isEmpty( Q ) )
{
int temp = dequeue( Q );
printf( "%d -> ", temp );
displayQueue( Q );
reverse( Q );
enqueue( Q, temp );
reverse( Q );
}
}
如果你想避免如此频繁地反转队列,那么你可以使用静态变量编写函数,例如
void displayQueue( queue *Q )
{
static int state = 0;
if ( !isEmpty( Q ) )
{
int to_reverse = state ^ 1;
if ( to_reverse ) state = to_reverse;
int temp = dequeue( Q );
printf( "%d -> ", temp );
displayQueue( Q );
enqueue( Q, temp );
if ( to_reverse )
{
reverse( Q );
state = 0;
}
}
}
如果没有静态变量,您可以编写将其拆分为两个函数的函数。第一个调用递归函数并反转结果。第二个是显示队列的递归函数。
例如
void recursiveDisplayQueue( queue *Q )
{
if ( !isEmpty( Q ) )
{
int temp = dequeue( Q );
printf( "%d -> ", temp );
recursiveDisplayQueue( Q );
enqueue( Q, temp );
}
}
void displayQueue( queue *Q )
{
if ( !isEmpty( Q ) )
{
recursiveDisplayQueue( Q );
reverse( Q );
}
}