C语言 出栈入栈组合 谁能解释一下这个代码的工作原理和思想,看不懂这段代码

2024-11-16 16:20:07
推荐回答(1个)
回答1:

简化了一下程序。其实很简单的,你可以想象一下自己手工出入栈的情形。如果栈顶有元素,可能让它先出栈,也可以不出。但不管它出不出栈,接下来只要还有元素还未入栈,就得继续入栈。这样就保证了所有可能的情形。如果你能理解这一点,那么程序也不难读懂了。
char in[10] = "abcd"; // 待入栈的元素
char stack[10]; // 在栈中的元素
char out[10]; // 出栈的元素
const int TOTAL = 4; // 元素总数
// 打印出栈顺序
void display()
{
int i;
for (i = 0; i < TOTAL; i++)
printf("%c ", out[i]);
printf("\n");
}
/**
* li:当前待入栈的元素下标
* ls:栈中的元素数(也即栈顶元素的下标+1)
* lo:当前出栈的元素下标
* 本函数使用递归穷举所有可能的出入栈可能
*/
void f(int li, int ls, int lo)
{
char s;

if (li == TOTAL && ls == 0) // 已全部入栈且全部出栈,打印出栈结果
display();
else
{
// 栈中有元素,考虑出栈或不出栈
if (ls > 0)
{
out[lo] = stack[ls - 1];
s = out[lo];
// 对栈顶元素的处理导致了两条分支
// 分支1,栈顶元素出栈
f(li, ls - 1, lo + 1);
// 分支2,栈顶元素不出栈
stack[ls - 1] = s;
}
// 尚未全部入栈,入栈
if (li < TOTAL)
{
stack[ls] = in[li];
f(li + 1, ls + 1, lo);
}
}
}
int main()
{
f(0, 0, 0);
return 0;
}