栈的应用,括号匹配,后缀表达式计算,有趣的汉诺塔--python实现

来源:互联网 发布:禅道数据库配置 编辑:程序博客网 时间:2024/05/16 06:08

三个例子很简单,都来自数据结构课本上的例子。但简单才好玩嘛。

第一个:括号匹配,就是找左括号有没有相匹配的右括号,反之亦然。

代码:

# -*- coding:utf-8 -*-# 栈的应用:括号匹配def MatchPairs(str):arr = list(s)stack = []for x in range(0, len(arr)):if arr[x] == "(":stack.append(x)# print(stack)if arr[x] == ")":if len(stack) != 0:print("位置", stack.pop(), "的左括号与位置", x, "的右括号匹配!")else:print("位置", x, "的右括号没有左括号与之匹配!")while len(stack) != 0:print("位置", stack.pop(), "的左括号没有与之匹配的右括号!")# 测试s = "(a*(b-c)-d))"MatchPairs(s)
值得注意的:字符串List()方法,他能将字符串切割成字符用数组存起来。

第二个:后缀表达式计算,计算机一般都是将我们输入的中缀表达式转换为后缀表达式,然后进行计算的。

具体怎么做:

遍历表达式,遇到数字用栈存起来,遇到计算符号就弹出两个数字进行计算,然后将结果压入栈。继续遍历。

最后栈中只有一个数字就是表达式的结果。

代码:

# 栈的应用:后缀表达式的计算def calculator(str):arr = list(str)stack = []for x in range(0, len(arr)):if arr[x] in ("+","-","*","/"):left = float(stack.pop())right = float(stack.pop())if arr[x] == "+":stack.append(left+right)if arr[x] == "-":stack.append(left-right)if arr[x] == "*":stack.append(left*right)if arr[x] == "/":stack.append(left/right)else:stack.append(arr[x])print("表达式结果是:", stack[0]) # 测试s = "1234-*+56/-"calculator(s)

值得注意的是:纯数字字符串转换为浮点型方法:float()方法 ,十分好用。

在python3.x中已经不区分整形与长整型了,理论上可以是无穷大。

第三个:有趣的汉诺塔。

有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子C上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。

思路:

第一步:将n-1个盘子从A移动到B(这是递归),不要深究怎么移动到B,递归解决。

第二步,将A上剩下的最后一个最大的盘子从A移动到C。

第三步:将B上的n-1个盘子从B移动到C(这儿递归)。

代码:

# 递归与栈:汉诺塔问题。def Hanoi(n, a, b, c):count = 1if n == 1:print(a, "-->", c)else: Hanoi(n-1, a, c, b)   # 这三句的顺序很重要,思路要清楚。首先,要将n个盘子从A移动去C,那么 print(a, "-->", c)    # 第一步:将n-1个盘子从A移动到B(这是递归)。第二步,将剩下的最后一个最大的盘子从A移动到C. Hanoi(n-1, b, a, c)   # 第三步:将B上的n-1个盘子从B移动到C(这儿递归)。所以代码才这么写的。# 测试Hanoi(3,'A','B','C')
对问题本身如果有不清楚,直接百度百科。

 

阅读全文
0 0
原创粉丝点击