Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Infix 2 Postfix Implementacija

[es] :: Art of Programming :: Infix 2 Postfix Implementacija

[ Pregleda: 4051 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

anon315

Član broj: 315
Poruke: 1657
*.adsl.sezampro.yu.



+13 Profil

icon Infix 2 Postfix Implementacija19.05.2005. u 11:11 - pre 230 meseci
Ucim strukture podataka, pa mi je zatrebalo programce koje ce moci da proveri da li mi je tacan rezultat.

Evo implementacije ovog algoritma u Pythonu.



Code:

def push_stack(stackArr,ele):
    stackArr.append(ele)

def pop_stack(stackArr):
    return stackArr.pop()

def isOperand(who):
    if(not(isOperator(who)) and (who != "(") and (who != ")")):
        return 1
    return 0

def isOperator(who):
    if(who == "+" or who == "-" or who == "*" or who == "/" or who == "^"):
        return 1
    return 0

def topStack(stackArr):
    return(stackArr[len(stackArr)-1])

def isEmpty(stackArr):
    if(len(stackArr) == 0):
        return 1
    return 0

def prcd(who):
    if(who == "^"):
    return(5)
    if((who == "*") or (who == "/")):
    return(4)
    if((who == "+") or (who == "-")):
    return(3)
    if(who == "("):
    return(2)
    if(who == ")"):
    return(1)

def ip(infixStr,postfixStr = [],retType = 0):
    postfixStr = []
    stackArr = []
    postfixPtr = 0
    tempStr = infixStr
    infixStr = []
    infixStr = strToTokens(tempStr)
    for x in infixStr:
    if(isOperand(x)):
            postfixStr.append(x)
            postfixPtr = postfixPtr+1
        if(isOperator(x)):
            if(x != "^"):
                while((not(isEmpty(stackArr))) and (prcd(x) <= prcd(topStack(stackArr)))):
                    postfixStr.append(topStack(stackArr))
                    pop_stack(stackArr)
                    postfixPtr = postfixPtr+1
            else:
                while((not(isEmpty(stackArr))) and (prcd(x) < prcd(topStack(stackArr)))):
                    postfixStr.append(topStack(stackArr))
                    pop_stack(stackArr)
                    postfixPtr = postfixPtr+1
            push_stack(stackArr,x)
        if(x == "("):
                push_stack(stackArr,x)                
        if(x == ")"):
            while(topStack(stackArr) != "("):
                postfixStr.append(pop_stack(stackArr))
                postfixPtr = postfixPtr+1
            pop_stack(stackArr)
            
    while(not(isEmpty(stackArr))):
        if(topStack(stackArr) == "("):
            pop_stack(stackArr)
        else:
            postfixStr.append(pop_stack(stackArr))

    returnVal = ''
    for x in postfixStr:
        returnVal += x

    if(retType == 0):
        return(returnVal)
    else:
        return(postfixStr)

def pi(postfixStr):
    stackArr = []
    tempStr = postfixStr
    postfixStr = []
    postfixStr = tempStr
    for x in postfixStr:
    if(isOperand(x)):
            push_stack(stackArr,x)
    else:
            temp = topStack(stackArr)
        pop_stack(stackArr)
        pushVal = '(' + topStack(stackArr) + x + temp + ')'
        pop_stack(stackArr)
        push_stack(stackArr,pushVal)
    return(topStack(stackArr))

def strToTokens(str):
    strArr = []
    strArr = str
    tempStr = ''    
    tokens = []
    tokens_index = 0
    count = 0
    for x in strArr:
        count = count+1
        if(isOperand(x)):
            tempStr += x
        if(isOperator(x) or x == ")" or x == "("):
            if(tempStr != ""):
                tokens.append(tempStr)
                tokens_index = tokens_index+1
            tempStr = ''
            tokens.append(x)
            tokens_index = tokens_index+1 
        if(count == len(strArr)):
            if(tempStr != ''):
                tokens.append(tempStr)
    return(tokens)

def PostfixSubEval(num1,num2,sym):
    num1,num2 = float(num1),float(num2)
    if(sym == "+"):
        returnVal = num1 + num2
    if(sym == "-"):
        returnVal = num1 - num2
    if(sym == "*"):
        returnVal = num1 * num2
    if(sym == "/"):

        returnVal = num1 / num2
    if(sym == "^"):
        returnVal = pow(num1,num2)
    return returnVal

def PostfixEval(postfixStr):
    temp = postfixStr
    postfixStr = []
    postfixStr = temp
    stackArr = []
    for x in postfixStr:
        if(isOperand(x)):
            push_stack(stackArr,x)
        else:
            temp = topStack(stackArr)
            pop_stack(stackArr)
            pushVal = PostfixSubEval(topStack(stackArr),temp,x)
            pop_stack(stackArr)
            push_stack(stackArr,pushVal)
    return(topStack(stackArr))

def InfixEval(infixStr):
    return PostfixEval(ip(infixStr,[],1))

def menu():
    def again():
        flag = raw_input('Continue (y/n)?')
        if flag not in ('y','n'):
            again()
        if(flag == 'y'):
            menu()
        if(flag == 'n'):
            exit

    print '\n############################'
    print '# Infix-Postfix Calculator #'
    print '############################'    
    print '\n(1) Infix to Postfix'
    print '(2) Postfix to Infix'
    print '(3) Evaluate Infix'
    print '(4) Evaluate Postfix'
    print '(5) Exit'
    opt = raw_input("Enter option (1/2/3/4/5): ")
    if opt in ('1','2','3','4','5'):
        if(opt == '1'):
            what = raw_input('\nEnter Infix String: ')
            print 'Postfix String: ', ip(what)
        if(opt == '2'):
            what = raw_input('\nEnter Postfix String: ')
            print 'Infix String: ', pi(what)
        if(opt == '3'):
            what = raw_input('\nEnter Infix String: ')
            print 'Infix Value: ', InfixEval(what)
        if(opt == '4'):
            what = raw_input('\nEnter Infix String: ')
            print 'Postfix Value: ', PostfixEval(what)
        if(opt == '5'):
            exit
        if(opt != '5'):
            again()
    else:
        menu()

menu()
Prikačeni fajlovi
 
Odgovor na temu

toroman
Srećko Toroman
www.wowd.com
Beograd / Banja Luka

Član broj: 52673
Poruke: 159
*.dialup.blic.net.

Sajt: toroman.wordpress.com


Profil

icon Re: Infix 2 Postfix Implementacija25.05.2005. u 17:24 - pre 230 meseci
n1, mada mi je smiješno, zašto si napisao funkciju push_stack ? :)
append() je komplikovan? ;)
Programeri su odgovorili na Hamletovo pitanje "Biti il ne biti?" :
0x2B | ~0x2B = 0xFF
(kao ono - ff - teško pitanje!)
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl.sezampro.yu.



+13 Profil

icon Re: Infix 2 Postfix Implementacija25.05.2005. u 19:38 - pre 230 meseci
Mozda ces prestati da se smejes ako ti kazem da je na ispitu dozvoljeno implementirati algoritme u bilo kom jeziku, ali NE koristeci gotove klase.
 
Odgovor na temu

toroman
Srećko Toroman
www.wowd.com
Beograd / Banja Luka

Član broj: 52673
Poruke: 159
*.dialup.blic.net.

Sajt: toroman.wordpress.com


Profil

icon Re: Infix 2 Postfix Implementacija26.05.2005. u 15:11 - pre 230 meseci
jel to da bi profesor lakše "pregledao" rad ili šta?

mislim, ti opet koristiš append (što reče, gotovu klasu), samo što si ga sakrio pod tom funkciom push_stack.

zeznuti ti fakulteti onda :)
Programeri su odgovorili na Hamletovo pitanje "Biti il ne biti?" :
0x2B | ~0x2B = 0xFF
(kao ono - ff - teško pitanje!)
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl.sezampro.yu.



+13 Profil

icon Re: Infix 2 Postfix Implementacija26.05.2005. u 17:17 - pre 230 meseci
Citat:
zeznuti ti fakulteti onda :)


Ne bi verovao ..
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Infix 2 Postfix Implementacija27.05.2005. u 13:07 - pre 230 meseci
Program je OK (uglavnom, moglo bi i dosta bolje), ali pazi da ne promašiš temu! Ako se ispit zove Strukture podataka, onda ne bi trebalo da poenta bude na samom algoritmu, koliko na tome koju strukturu koristiš. Ti si ovde implementirao stek preko dinamičkog niza što je OK u većini jezika, ali ima jezika koji to ne dozvoljavaju. To ne bi trebalo da bude ograničavajući faktor, ali još jednom, poenta je u strukturi.
Prirodna struktura za matematičke izraze je stablo. Kada parsiraš izraz, napraviš od njega stablo i u zavisnosti od načina obilaska stabla, dobijaš infiks, postfiks ili prefiks notaciju izraza.
U ovom forumu na vrhu postoji niz dosta dobrih postova o strukturama podataka.
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl.sezampro.yu.



+13 Profil

icon Re: Infix 2 Postfix Implementacija27.05.2005. u 13:14 - pre 230 meseci
Ah, uh ...

Pajite, program mi je samo trebao za proveru, btw izgleda da nisam rekao da ga ja nisam pisao nego sam uzeo c&p :D ...
 
Odgovor na temu

[es] :: Art of Programming :: Infix 2 Postfix Implementacija

[ Pregleda: 4051 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.