为什么将递归转换成循环需要用到栈?
递归其实是在每次调用自己来进入新的状态,直到最后一次的状态能够满足递归的结束条件,然后返回到上次的状态。我们都知道栈有着后进先出的特性,那这样是不是就可以理解为递归每调用一层就压入栈,直到最后满足递归结束条件,再一层层弹出栈,那么用栈来将递归改为循环,就可以理解了。
下面我们看一个例子,逆序打印链表:
递归实现:
void ReversePrint(Node* pHead) {
if (pHead) {
ReversePrint(pHead->next);
printf("%d ", pHead->data);
}
}
用栈来实现:
void ReversePrint(Node* pHead) {
if (pHead == NULL) {
return;
}
Stack s;
StackInit(&s);
Node* pCur = pHead;//遍历链表,将链表中元素放到栈中
while (pCur) {
StackPush(&s, pCur->data);
pCur = pCur->_M_next;
}
//将栈中所有元素打印
while (StackEmpty(&s)) {
printf("%d ", StackTop(&s));
StackPop(&s);
}
StackDestory(&s);
}
用C语言中栈来实现的话,前面还需要封装一个栈哦,我这里没有写,直接拿来用了。