def infixToPostfix(infixexpr): prec = {} prec["^"] = 3 prec["*"] = 3 prec["/"] = 3 prec["+"] = 2 prec["-"] = 2 prec["("] = 1 opStack = Stack() postfixList = [] tokenList = infixexpr.split() for token in tokenList: if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or is_float(token): postfixList.append(token) elif token == '(': opStack.push(token) elif token == ')': topToken = opStack.pop() while topToken != '(': postfixList.append(topToken) topToken = opStack.pop() else: while (not opStack.isEmpty()) and \ (prec[opStack.peek()] >= prec[token]): postfixList.append(opStack.pop()) opStack.push(token) while not opStack.isEmpty(): postfixList.append(opStack.pop()) return " ".join(postfixList)
class Queue: def __init__(self): self.input = Stack() self.output = Stack() def isEmpty(self): return self.input.isEmpty() and self.output.isEmpty() def enqueue(self, item): self.input.push(item) def dequeue(self): for item in self.input.items: self.output.push(item) return self.output.pop() def size(self): return len(self.input.items) def __str__(self): string = "" for item in self.input.items: string = string + " " + str(item) return string
def process(q, a, b): q_s = Stack() for i in q.items: q_s.push(i) a_s = Stack() b_s = Stack() while not q_s.isEmpty(): tmp_op = q_s.pop() tmp_name = q_s.pop() if tmp_op == "A": a_s.push(tmp_name) elif tmp_op == "B": b_s.push(tmp_name) elif tmp_op == "X": if a_s.size() < b_s.size(): a_s.push(tmp_name) elif a_s.size() > b_s.size(): b_s.push(tmp_name) elif a_s.size() == b_s.size(): tmp_name = None tmp_op = None for x in a_s.items: a.enqueue(x) for y in b_s.items: b.enqueue(y) for j in q_s.items: q.enqueue(j) return q.items, a.items, b.items
def merge(a, b): sa = Stack() sb = Stack() # Inserir os items de cada queue em stacks independentes for i in a.items: sa.push(i) for j in b.items: sb.push(j) # Comparar os 2 stacks sc = Stack() while not sa.isEmpty() and not sb.isEmpty(): if sa.peek() < sb.peek(): tmp = sa.pop() sc.push(tmp) tmp = sb.pop() sc.push(tmp) elif sb.peek() < sa.peek(): tmp = sb.pop() sc.push(tmp) tmp = sa.pop() sc.push(tmp) # Virar o stack ao contrario sd = Stack() while not sc.isEmpty(): tmp = sc.pop() sd.push(tmp) # Inserir o stack temporario na queue final c = Queue() for y in sd.items: c.enqueue(y) return c
def infixToPostfix(infixexpr): prec = {} prec["^"] = 3 prec["*"] = 3 prec["/"] = 3 prec["+"] = 2 prec["-"] = 2 prec["("] = 1 opStack = Stack() postfixList = [] tokenList = infixexpr.split() for token in tokenList: if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or is_float(token): postfixList.append(token) elif token == '(': opStack.push(token) elif token == ')': topToken = opStack.pop() while topToken != '(': postfixList.append(topToken) try: topToken = opStack.pop() except IndexError: return "Expressão Inválida: " + infixexpr else: try: while (not opStack.isEmpty()) and (prec[opStack.peek()] >= prec[token]): postfixList.append(opStack.pop()) opStack.push(token) except KeyError: return "Operador Inválido: " + "'" + token + "'" + " de " + infixexpr while not opStack.isEmpty(): postfixList.append(opStack.pop()) return " ".join(postfixList)