三个例子很简单,都来自数据结构课本上的例子。但简单才好玩嘛。
第一个:括号匹配,就是找左括号有没有相匹配的右括号,反之亦然。
代码:
# -*- 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)
在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')
对问题本身如果有不清楚,直接百度百科。