コード例 #1
0
ファイル: nfa.py プロジェクト: tata19900822/itu.algs4
    def __init__(self, regex):
        """Initializes the NFA from the specified regular expression.

        :param regex: the regular expression

        """
        self.regex = regex
        m = len(regex)
        self.m = m
        ops = Stack()
        graph = Digraph(m + 1)
        for i in range(0, m):
            lp = i
            if regex[i] == "(" or regex[i] == "|":
                ops.push(i)
            elif regex[i] == ")":
                or_ = ops.pop()

                # 2-way or operator
                if regex[or_] == "|":
                    lp = ops.pop()
                    graph.add_edge(lp, or_ + 1)
                    graph.add_edge(or_, i)
                elif regex[or_] == "(":
                    lp = or_
                else:
                    assert False
            if i < m - 1 and regex[i + 1] == "*":
                graph.add_edge(lp, i + 1)
                graph.add_edge(i + 1, lp)
            if regex[i] == "(" or regex[i] == "*" or regex[i] == ")":
                graph.add_edge(i, i + 1)
        if ops.size() != 0:
            raise ValueError("Invalid regular expression")
        self.graph = graph
コード例 #2
0
ファイル: evaluate.py プロジェクト: joemocha/itu.algs4
def evaluate():
    ops = Stack()
    vals = Stack()

    while not stdio.isEmpty():
        # Read token, push if operator
        s = stdio.readString()
        if   s == "(": pass
        elif s == "+":      ops.push(s)
        elif s == "-":      ops.push(s)
        elif s == "*":      ops.push(s)
        elif s == "/":      ops.push(s)
        elif s == "sqrt":   ops.push(s)
        elif s == ")":
            # Pop, evaluate and push result if token is ")"
            op = ops.pop()
            v = vals.pop()
            if   op == "+":     v = vals.pop() + v
            elif op == "-":     v = vals.pop() - v
            elif op == "*":     v = vals.pop() * v
            elif op == "/":     v = vals.pop() / v
            elif op == "sqrt":  v = math.sqrt(v)
            vals.push(v)
        else:   
            vals.push(float(s))
    stdio.writeln(vals.pop())
コード例 #3
0
ファイル: balance.py プロジェクト: jonas-mika/itu
def check_syntax(s: str):
    stack = Stack()
    map_ = {
        "(": [0, 1],
        "[": [0, 2],
        "{": [0, 3],
        ")": [1, 1],
        "]": [1, 2],
        "}": [1, 3]
    }

    for cha in s.strip():
        if map_[cha][0] == 0:
            stack.push(map_[cha][1])
        elif map_[cha][0] == 1:
            try:
                if stack.peek() == map_[cha][1]:
                    stack.pop()
                else:
                    return "0"
            except:
                return "0"

    if stack.is_empty() == True:
        return "1"
    else:
        return "0"
コード例 #4
0
def evaluate(expression):
    ops = Stack()
    vals = Stack()

    for char in expression:
        if char == '(':
            None
        elif char == '+':
            ops.push('+')
        elif char == '-':
            ops.push('-')
        elif char == '*':
            ops.push('*')
        elif char == '/':
            ops.push('/')
        elif char == ')':
            op = ops.pop()
            v = vals.pop()

            if op == '+':
                v = vals.pop() + v
            elif op == '-':
                v = vals.pop() - v
            elif op == '*':
                v = vals.pop() * v
            elif op == '/':
                v = vals.pop() / v
            vals.push(v)
        else:
            vals.push(int(char))
        #print(f'Operation Stack: {ops}')
        #print(f'Value Stack: {vals}')

    return vals.pop()