栈及其简单应用(二)(python代码)

一、括号判定

前一篇文章我们介绍了栈的简单应用中,关于括号的判定,但那只是一种括号的判定,下面我们来介绍多种括号混合使用时,如何判断括号左右一一对应。

比如“{}{(}(][”这种情况,需要对一种括号判定的代码进行修改。

 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()] #余数出栈

猜你喜欢

转载自www.cnblogs.com/qjjfzmx/p/13371618.html