[ anon315 @ 19.05.2005. 11:11 ] @
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()
[ toroman @ 25.05.2005. 17:24 ] @
n1, mada mi je smiješno, zašto si napisao funkciju push_stack ? :)
append() je komplikovan? ;)
[ anon315 @ 25.05.2005. 19:38 ] @
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.
[ toroman @ 26.05.2005. 15:11 ] @
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 :)
[ anon315 @ 26.05.2005. 17:17 ] @
Citat:
zeznuti ti fakulteti onda :)


Ne bi verovao ..
[ djoka_l @ 27.05.2005. 13:07 ] @
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.
[ anon315 @ 27.05.2005. 13:14 ] @
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 ...