예제 #1
0
def infix_to_potfix(token_list):
    """
    들어온 중위 표현식을 후위 표현식으로 변경
    :param token_list:
    :return: 후위 표현식
    """
    prec = {'*': 3, '/': 3, '+': 2, '-': 2, '(': 1}

    opStack = ArrayStack()
    result = []

    for token in token_list:
        if isinstance(token, int):
            result.append(token)
        elif token == '(':
            opStack.push(token)
        elif token == ')':
            while opStack.peek() != '(':
                result.append(opStack.pop())
            opStack.pop()
        else:
            if not opStack.isEmpty():
                if prec[opStack.peek()] >= prec[token]:
                    result.append(opStack.pop())
                    opStack.push(token)
                else:
                    opStack.push(token)
            else:
                opStack.push(token)

    while not opStack.isEmpty():
        result.append(opStack.pop())

    print(result)
    return result
예제 #2
0
def solveMaze(row, column, maze):
    stack = ArrayStack()
    stack.push((row, column))

    while not stack.isEmpty():
        (row, column) = stack.peek()
        if maze[row][column] == 'T':
            return stack
        elif maze[row][column] != '.':
            maze[row][column] = '.'
            counter = 0  ###adjacent cells based on changing x,y values so need 4 options
            if row != 0 and not maze[row - 1][column] in ('*', '.'):
                stack.push((row-1, column))
                counter += 1
            if row + 1 != maze.getHeight() and not maze[row + 1][column] in ('*', '.'):
                stack.push((row + 1, column))
                counter += 1
            if column + 1 != maze.getWidth() and not maze[row][column + 1] in ('*', '.'):
                stack.push((row, column + 1))
                counter += 1
            if column != 0 and not maze[row][column -1] in ('*', '.'):
                stack.push((row, column - 1))
                counter += 1
        if counter == 0:
            stack.pop()
    return None
예제 #3
0
class PFEvaluator(object):
   
    def __init__(self, scanner):
        self._expressionSoFar = ""
        self._operandStack = ArrayStack()
        self._scanner = scanner

    def evaluate(self):
        while self._scanner.hasNext():
            currentToken = self._scanner.next()
            self._expressionSoFar += str(currentToken) + " "
            if currentToken.getType() == Token.INT:
                self._operandStack.push(currentToken)
            elif currentToken.isOperator(): 
                if len(self._operandStack) < 2:
                    raise Exception, \
                          "Too few operands on the stack"
                t2 = self._operandStack.pop()
                t1 = self._operandStack.pop()
                result = Token(self._computeValue(currentToken,
                                                  t1.getValue(),
                                                  t2.getValue()))
                self._operandStack.push(result)

            else:
                raise Exception, "Unknown token type"
        if len(self._operandStack) > 1:
            raise Exception, "Too many operands on the stack"
        result = self._operandStack.pop()
        return result.getValue();   

    def __str__(self):
        result = "\n"
        if self._expressionSoFar == "":
            result += "Portion of expression processed: none\n"
        else: 
            result += "Portion of expression processed: " + \
                   self._expressionSoFar + "\n"
        if self._operandStack.isEmpty():
            result += "The stack is empty"
        else:
            result += "Operands on the stack          : " + \
                      str(self._operandStack)
        return result

    def _computeValue(self, op, value1, value2):
        result = 0;
        theType = op.getType()
        if theType == Token.PLUS:
            result = value1 + value2;
        elif theType == Token.MINUS:
            result = value1 - value2;
        elif theType == Token.MUL:
            result = value1 * value2;
        elif theType == Token.DIV:
            result = value1 / value2;
        else:
            raise Exception, "Unknown operator" 
        return result
예제 #4
0
class PFEvaluator(object):
    def __init__(self, scanner):
        self._expressionSoFar = ""
        self._operandStack = ArrayStack()
        self._scanner = scanner

    def evaluate(self):
        while self._scanner.hasNext():
            currentToken = self._scanner.next()
            self._expressionSoFar += str(currentToken) + " "
            if currentToken.getType() == Token.INT:
                self._operandStack.push(currentToken)
            elif currentToken.isOperator():
                if len(self._operandStack) < 2:
                    raise Exception, \
                          "Too few operands on the stack"
                t2 = self._operandStack.pop()
                t1 = self._operandStack.pop()
                result = Token(
                    self._computeValue(currentToken, t1.getValue(),
                                       t2.getValue()))
                self._operandStack.push(result)

            else:
                raise Exception, "Unknown token type"
        if len(self._operandStack) > 1:
            raise Exception, "Too many operands on the stack"
        result = self._operandStack.pop()
        return result.getValue()

    def __str__(self):
        result = "\n"
        if self._expressionSoFar == "":
            result += "Portion of expression processed: none\n"
        else:
            result += "Portion of expression processed: " + \
                   self._expressionSoFar + "\n"
        if self._operandStack.isEmpty():
            result += "The stack is empty"
        else:
            result += "Operands on the stack          : " + \
                      str(self._operandStack)
        return result

    def _computeValue(self, op, value1, value2):
        result = 0
        theType = op.getType()
        if theType == Token.PLUS:
            result = value1 + value2
        elif theType == Token.MINUS:
            result = value1 - value2
        elif theType == Token.MUL:
            result = value1 * value2
        elif theType == Token.DIV:
            result = value1 / value2
        else:
            raise Exception, "Unknown operator"
        return result
예제 #5
0
def bracketsBalance(exp, Open, Close):
    """exp represents the expression"""
    stk = ArrayStack()  # Create a new stack
    for ch in exp:  # Scan across the expression
        if ch in Open:  # Push an opening bracket
            stk.push(ch)
        elif ch in Close:  # Process a closing bracket
            if stk.isEmpty():  # Not balanced
                return False
            chFromStack = stk.pop()
            # Brackets must be of same type and match up

            OpenIndex = Open.index(chFromStack)
            CloseIndex = Close.index(ch)

            if OpenIndex != CloseIndex:
                return False

    return stk.isEmpty()  # They all matched up
예제 #6
0
def multiBaseOutput(num, b):
    stk = ArrayStack()
    s1 = ''

    while num != 0:
        stk.push(str(num % b))
        num = num // b

    while not stk.isEmpty():
        s1 += stk.pop()

    return s1
예제 #7
0
def is_brackets(expr):
    match = {
        ')':'(',
        ']':'[',
        '}':'{'
    }

    S = ArrayStack()

    for c in expr:
        if c in '({[':
            S.push(c)
        else:
            if S.isEmpty():
                return False
            else:
                bracket = S.pop()
                if bracket != match[c]:
                    return False

    return S.isEmpty() # 스택이 비어있지 않으면 괄호가 안맞음.
예제 #8
0
def maze_solver(maze, starting_pt, target_pt):
    """Implement backtracking algorithms using a stack to solve a maze"""
    if_solvable = False
    maze_stack = ArrayStack()
    path = {}
    maze_stack.push(starting_pt)
    while not maze_stack.isEmpty():
        location = maze_stack.pop()
        if maze[location[0]][location[1]] == 'T':
            if_solvable = True
        elif maze[location[0]][location[1]] != '.':
            maze[location[0]][location[1]] = '.'
            nrs = check_neighbours(maze, location[0], location[1])
            for nr in nrs:
                maze_stack.push(nr)
                path[nr] = location
    return if_solvable, path