算法分析与设计(第五周)【已完结】

本周知识要点:

(与第六周一样 是对数据结构的知识学习)
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层到目的地的步数 即2^{n}-1,所以T\left ( n \right ) = O\left ( 2^{n} \right )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值