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

版权声明:写博客记录自己学习的过程,相当于是个笔记吧。如有错误,还请指出。转载请标注出处。 https://blog.csdn.net/Waterkong/article/details/78158706

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

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

代码:

# -*- 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 = 1
	if 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')
对问题本身如果有不清楚,直接百度百科。

 

猜你喜欢

转载自blog.csdn.net/Waterkong/article/details/78158706