栈
队列
表达式求值问题
- 表达式求值:首先要考虑的是运算符的优先级的顺序,其次是运算符的结合方向。(例如:表达式x+yz,首先要先运算yz,再运算x+(y*z),其存入计算机的顺序是从左到右的顺序。)
问题分析:
其中,例如 :x+y+z这个表达式,依据表中运算符的优先级顺序,先算x+y再算第二个加号。
算法思路:
算法实现:
要是251的话,用getchar()就不能实现了,那该怎么办;还有就是要是单目运算符的怎么办,还有就是后缀运算符????
|
|
递归与分治算法
分治法概念:顾名思义就是用我们平常所说的“分而治之”的思想来解决复杂的,难以直接解决的问题。(如:问题规模为n的hanoi问题是难以直接解决的,所以可以分解为两个问题规模为n-1的两个hanoi问题····,直至分解到问题规模为1,即使问题规模小到能够方便的直接求解为止,具体问题具体分析)
分治法求解问题的基本策略:
其中,分治法与递归经常同时用在算法的设计之中,因为分治法分解的子问题往往是原问题的较小规模,这就自然 导致了递归技术的应用。
算法架构:
(其中,ADHOC()是一个c语言函数,adhoc的意思是 特别的/地; 临时的; 特设的; )- 分治法主要分三步:
分解 —–> 求解 ——> 合并
(1)分解:将一个大规模问题分解为有限个小规模的问题(小问题之间相互独立,并且它们的问题性质和原始问题的问题性质相同、独立),其实这点和递归有异曲同工之妙,其中小问题的规模为问题最小单位,分解的时候也是递归地分解;
(2)求解:一般地,我们可以递归地求解这n个小问题;
(3)合并:
- 分治法的应用
汉诺塔问题算法(递归分治算法):
例 棋盘覆盖问题:
实现的基本原理是将2^k 2^k的棋盘分成四块2^(k - 1) 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。
|
|