一、括号判定
前一篇文章我们介绍了栈的简单应用中,关于括号的判定,但那只是一种括号的判定,下面我们来介绍多种括号混合使用时,如何判断括号左右一一对应。
比如“{}{(}(][”这种情况,需要对一种括号判定的代码进行修改。
1 from stack import Stack //引入栈 2 def parChecker(symbolString): 3 s=Stack() 4 balanced = True 5 index = 0 6 while index < len(symbolString) and balanced: //当输入的字符串不为空时循环开始 7 symbol = symbolString[index] 8 if symbol in "([{": 9 s.push(symbol) //思路如一种括号判定时一样,从左到右逐渐循环,当碰到左括号时,加入栈。 10 11 else: 12 if s.isEmpty(): 13 balanced = False //当栈为空时,说明字符串内没有左括号,或者左括号已经全部出栈,但是仍有多余括号。判定不匹配。 14 else: 15 top = s.pop() 16 if not matches(top,symbol): 17 balanced = False //碰到右括号时,而且栈不为空,那么从栈推出一个左括号,看是否与这个右括号相匹配,如果不匹配则判定最终字符串括号不匹配。 18 19 index = index + 1 20 21 if balanced and s.isEmpty(): 22 return True 23 24 else: 25 return False
下面是判定左括号和右括号匹配的matches函数:
def matches(open,close):
opens = "([{"
closer = ")]}"
return opens.index(open) == closer.index(close)
输入一个括号字符串:
print(parChecker("{{[]}}"))
print(parChecker("{{[]}"))
结果如下:
二、进制转换
在进制转换中也有体现栈的特性的地方,比如十进制转换为二进制,如下图
二进制最后的结果为:10000011,刚好与余数顺序相反,这就与栈的先入后出相契合,在进制转换中,我们 可以把余数入栈,最后输出结果时在出栈。
from stack import Stack def divideBy2(decNumber,base): digits = "0123456789ABCDEF" remstack =Stack() while decNumber > 0: rem =decNumber%base remstack.push(rem) #把余数入栈 decNumber = decNumber // base binString = "" while not remstack.isEmpty(): binString = binString +digits[remstack.pop()] #余数出栈
原文:https://www.cnblogs.com/qjjfzmx/p/13371618.html