stack and queque

Infix, Prefix and Postfix Expressions
precedence level ? Setiap operator memiliki precedence level.


Maka Operasi perhitungannya mengikuti level dari precedence tersebut.
A + B * C + D = ((A + (B * C)) + D) à operator * lebih didahulukan daripada operator *, dan operator + yang pertama juga didahulukan daripada yang kedua (kiri ke kanan)
Jadi pronsip Precedence level adalah : Highest Precedence and Left to Right

Conversion of Infix Expressions to Prefix and Postfix
 à Post fix

 à Prefix





Baca setiap karakter notasi infix dari awal

 Bila operand maka langsung dicetak

 Bila tanda ‘(‘ masukkan stack

Bila tanda ‘)’ pop dan cetak semua isi stack sampai TOS = ‘(‘. Pop juga tanda ‘(‘ ini, tetapi tidak usah 

dicetak

Bila operator : jika stack kosong atau derajad operator lebih tinggi dibanding derajad TOS, push operator 

ke dalam stack. Jika tidak, pop dan cetak; kemudian ulangi pembandingan dengan TOS. Kemudian di-

push

( A + B ) / (( C – D ) * E ^ F) Ilustrasi pengubahan notasi infix di atas menjadi notasi postfix

Karakter dibaca
Isi Tumpukan
Karakter tercetak
Hasil Notasi Postfix Yang Terbentuk




from pythonds.basic.stack import Stack

def infixToPostfix(infixexpr):
    prec = {}
    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 token in "0123456789":
            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)

print(infixToPostfix("A * B + C * D"))
print(infixToPostfix("( A + B ) * C - ( D - E ) * ( F + G )"))

Postfix Evaluation

from pythonds.basic.stack import Stack

def postfixEval(postfixExpr):
    operandStack = Stack()
    tokenList = postfixExpr.split()

    for token in tokenList:
        if token in "0123456789":
            operandStack.push(int(token))
        else:
            operand2 = operandStack.pop()
            operand1 = operandStack.pop()
            result = doMath(token,operand1,operand2)
            operandStack.push(result)
    return operandStack.pop()

def doMath(op, op1, op2):
    if op == "*":
        return op1 * op2
    elif op == "/":
        return op1 / op2
    elif op == "+":
        return op1 + op2
    else:
        return op1 - op2

print(postfixEval('7 8 + 3 2 + /'))

Komentar

Postingan populer dari blog ini