def par_checker(symbol_string): """ 输入的括号是否匹配,可以检测([{的匹配 """ def matches(left_symbol, right_symbol): """ 输入的参数必须是([{}])之一 """ left = '([{' right = ')]}' return left.index(left_symbol) == right.index(right_symbol) s = Stack() for symbol in symbol_string: if symbol in '([{': s.push(symbol) elif symbol in ')]}': if s.is_empty(): return False else: if not matches(s.pop(), symbol): return False if s.is_empty(): return True else: return False
def test_stack(): s = Stack() print(s.is_empty()) s.push(4) s.push('dog') print(s.peek()) s.push(True) print(s.size()) print(s.is_empty()) s.push(8.4) print(s.pop()) print(s.pop()) print(s.size())
def infix_to_prefix(infix_expr): prec = dict() prec[")"] = 4 prec["*"] = 3 prec["/"] = 3 prec["+"] = 2 prec["-"] = 2 prec["("] = 1 prefix_expr = [] s = Stack() # 从右到左扫描 for item in reversed(infix_expr.split()): # 如果标记是操作数,将其附加到输出列表的末尾 if item not in prec.keys(): prefix_expr.append(item) # 如果标记是右括号,将其压到 s 上 elif item == ')': s.push(item) # 如果标记是左括号,则弹出 s,直到删除相应的右括号。将每个运算符附加到 # 输出列表的末尾 elif item == '(': while s.peek() != ')': prefix_expr.append(s.pop()) s.pop() # 如果标记是运算符, *,/,+ 或 - ,将其压入 s。但是,首先删除已经在 # s 中具有更高或相等优先级的任何运算符,并将它们加到输出列表中 else: while (not s.is_empty()) \ and s.peek() != ')' \ and prec[s.peek()] > prec[item]: prefix_expr.append(s.pop()) s.push(item) s.push(item) # print(s.items) # 当输入表达式被完全处理时,检查 s。仍然在栈上的任何运算符都可以删除并加到 # 输出列表的末尾 while not s.is_empty(): prefix_expr.append(s.pop()) # 反转序列 prefix_expr.reverse() return ' '.join(prefix_expr)
def fast_sort_nr(a_list: list): st = Stack() if len(a_list) > 1: st.push({'left': 0, 'right': len(a_list) - 1}) while not st.is_empty(): pt = st.pop() split_pos = partition(a_list, pt['left'], pt['right']) if pt['left'] < split_pos - 1: st.push({'left': pt['left'], 'right': split_pos - 1}) if split_pos + 1 < pt['right']: st.push({'left': split_pos + 1, 'right': pt['right']}) return a_list