我看到了一种不使用任何其他堆栈来反转堆栈的算法。我根据算法制作了C程序,但我真的不明白它是如何工作的。请帮我解释下面的代码。
#include<stdio.h>
void push(int item);
int pop();
void display();
void reverseStack();
void insertAtBottom(int);
typedef struct stack
{
int data;
struct stack* next;
} stack;
stack* top=NULL;
int main()
{
push(5);
push(13);
push(16);
push(17);
display();
pop();
printf("Display before reversal\n");
display();
reverseStack();
printf("Display after reversal\n");
display();
return 0;
}
void push(int data)
{
stack* temp = malloc(sizeof(stack));
temp->next=top;
temp->data = data;
top = temp;
}
int pop()
{
int a;
stack* temp;
temp = top;
if(top == NULL)
return -1;
//printf("popped item=%d\n", temp->data);
a = temp->data;
top = top->next;
free(temp);
return a;
}
void display()
{
stack* temp = top;
while(temp!=NULL)
{
printf("%d\n", temp->data);
temp = temp->next;
}
}
void reverseStack()
{
int data ;
if(top != NULL)
{
data = pop();
reverseStack();
insertAtBottom(data);
}
}
void insertAtBottom(int data)
{
int a;
if(top==NULL)
{
push(data);
return;
}
a = pop();
insertAtBottom(data);
push(a);
}
上述程序按预期工作。但是算法是如何工作的,我不确定。请解释一下。
答案 0 :(得分:1)
这里的关键功能是函数insertAtBottom
void insertAtBottom(int data)
{
int a;
if(top==NULL)
{
push(data);
return;
}
a = pop();
insertAtBottom(data);
push(a);
}
它在堆栈底部而不是堆栈顶部插入数据。它是如何工作的?它以递归方式弹出堆栈中的所有元素,当堆栈最后为空时,它会添加新元素:
if(top==NULL)
{
push(data);
return;
}
然后它按照它们在堆栈中的顺序恢复所有存在的元素
a = pop();
/*insertAtBottom(data);*/
push(a);
我评论中间声明它会更清楚。
另一方面,函数reverseStack
void reverseStack()
{
int data ;
if(top != NULL)
{
data = pop();
reverseStack();
insertAtBottom(data);
}
}
在堆栈底部插入元素调用函数insertAtBottom
假设堆栈具有值
顶部:1 2 3 4 底部:5
该函数首先以递归方式弹出堆栈中的所有元素
然后它推送堆栈中的最后一个元素
top->bottom: 5
然后在底部插入前一个元素
top: 5
bottom: 4
----------
等等
top:5
4
bottom: 3
----------
top: 5
4
3
bottom: 2
----------
top: 5
4
3
2
bottom: 1
----------
答案 1 :(得分:0)
您不需要另一个堆栈来反转堆栈。你可以在你的结构的一次迭代传递中做到这一点,你只需要一些局部变量来交换下一个指针:
void reverseStack()
{
stack* it = top->next;
top->next = NULL;
while(it!=NULL)
{
stack* temp = it->next;
it->next = top;
top = it;
it = temp;
}
}
PS:为空堆栈添加健全性检查取决于TO。