本周知识要点:
(与第六周一样 是对数据结构的知识学习)
5.1. 栈的应用:处理字符串运算、输出汉诺达解法
1. 栈的一些应用
1.1 概念栈(即C语言运行是就是一个栈的应用)
C管理内存大致可以理解为两种,分配在栈上的,一个是分配在堆上的。
临时变量,动态变量,分配在栈上,运行完,直接弹出栈,就没了。
分配在堆上的内存,释放的时候,基本上可以理解为,指针不指这里了。也就失去了对这块内存的控制
1.2 栈应用之处理四则运算
问题描述:给出一段加减乘除 如何用栈去处理这个文本,并得出正确的算式结果
代码参考:https://blog.csdn.net/cyq0318/article/details/78633752
这里仅 解释代码框架思路:
该代码分成两大部分:① 构建栈,以及栈操作 POP 操作 和 PUSH操作。
②构造四则运算规则:加减乘除 和 括号匹配问题(这里涉及运算优先级,括号第三级,乘除第二级,加减第一级)
处理四则运算的规则就是 一个符号栈 一个数字栈,开始从一段文本右边读入。读到符号就放入符号栈(并标上等级),读到数字栈放入数字栈(和符号一一对应)。运算规则,如果读到符号等级比前面的符号等级低级 就把前面的符号和数字作运算。最后剩下2个数字一个符号就直接作运算。
1.3 栈应用之解决n层汉诺塔问题
问题描述:有三个地点A,B,C和一个n层汉诺塔放在A地,放置规则是小层一定要放在地面或者大层之上。移动不需要考虑实际问题一步到达,同时输出转移步骤。
解题思路:我们先研究2层的汉诺塔问题,就是先把小的放在不是目的地地方(比如B)然后,再把大的放在目的地(比如C),最后再把小的放在目的地(比如C),那么对于n层我们同样可以这么做,把n层看做 最上一层 和 第一层以下,这样就变成2层问题,再把n-1层 看做 最上一层 和 第一层以下······,这样就是一个递归解法。
#include <stdio.h>
void f( char x, int n, char y ) {
if( n==1 ) {
printf( "%c => %c\n", x, y );
return;
}
char z = 3 - (x-'A') - (y-'A') + 'A';
f(x, n-1, z);
f(x, 1, y);
f(z, n-1, y);
}
int main() {
f( 'A', 3, 'B' );
return 0;
}
时间复杂度 就是 放n层到目的地的步数 即,所以