示例#1
0
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
示例#2
0
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())
示例#3
0
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)
示例#4
0
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