Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Python для новичков
  • » Перевод выражения из инфиксной (математической) нотации в обратную польскую (постфиксную) нотацию. [RSS Feed]

#1 Окт. 3, 2014 21:31:27

shvedoff
Зарегистрирован: 2014-10-03
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Перевод выражения из инфиксной (математической) нотации в обратную польскую (постфиксную) нотацию.

Писал свою четвертую программу на питоне и не смог. Она нормально считает выражения в скобках, но спотыкается, если ввести без них или, если в выражении присутствует знак деления \
В чем ошибка?

polsk=input("vvedi polskyy ")
k=list(polsk)
za=""
zo=""
h=ip=1
l=len(k)
vyhod = stk = []
for i in range (len(k)-1):
    if i<len(k):
        print (k)
        p=k[i]
        ln=len(stk)
        
        print(stk)
        if p.isdigit() :
            vyhod=vyhod+list(p)
        print (vyhod,"vyhod")     
        
        if ln != 0:
            if p == "*" or p == "/" and stk[ln-1] == "+" or stk[ln-1] == "-":
                v=p
                v=list(v)
                stk = v+stk
                stk.pop()
                LL=len(stk)
                by=list(stk[LL-1])
                vyhod=vyhod+by                
                stk.pop()
                k.remove(p)
            else:
                
                if p == "+" or p == "-":
                    
                    stk=stk+list(p)
        
                if p == "*" or p == "/":
                     stk=stk+list(p)
        ln=len(stk)
        if ln != 0:
            if p == "+" or p == "-" and stk[ln-1] == "*" or stk[ln-1] == "/":
                v=p
                v=list(v)
                stk = v+stk
                stk.pop()
                LL=len(stk)
                by=list(stk[LL-1])
                vyhod=vyhod+by                
                stk.pop()
                k.remove(p)
            else:
                if p == "+" or p == "-":
                    stk=stk+list(p)        
                if p == "*" or p == "/":
                    stk=stk+list(p)
        else:
            if p == "+" or p == "-":
                stk=stk+list(p)
        
            if p == "*" or p == "/":
                 stk=stk+list(p)
        if p == "(":
            dop=[]
            dop=stk
            ip=i
            k.remove(p)
            while p!= ")":
                ip=ip+1
                p=k[ip]
                ln=len(stk)            
                print(stk)
                if p.isdigit() :
                    vyhod=vyhod+list(p)
                    k.remove(p)
                    print (vyhod, "isdigi")
                    print (k)
                    
                else:
                    if p == "+" or p == "-":
                        stk=stk+list(p)
                        k.remove(p)
                    else:
                        if ln != 0:
                            if p == "*" or p == "/" and stk[ln-1] == "+" or stk[ln-1] == "-" :
                                v=p
                                v=list(v)
                                stk = v+stk
                                print (p)
                                print (k)
                                k.remove(p)
                
                print(vyhod,"1..")
                print(stk,"1.")
            vyhod=vyhod+stk    
            stk.clear()
        
       
    
   
        
for i in range (len(vyhod)):
    d=str(vyhod[i])
    za=za+d
for i in range (len(stk)):
    da=str(stk[i])
    zo=zo+da    
print (za+zo)        

Офлайн

#2 Окт. 4, 2014 11:59:23

TroSer
От: Харьков
Зарегистрирован: 2013-11-13
Сообщения: 65
Репутация: +  3  -
Профиль   Отправить e-mail  

Перевод выражения из инфиксной (математической) нотации в обратную польскую (постфиксную) нотацию.

Не знаю как вам, но мне кажется, что переменные можно было бы немного понятнее называть. Не хочется даже вникать.

v=p
v=list(v)
v = list(p)
?
ln=len(stk)
        if ln != 0:
if stk:
? etc.

Отредактировано TroSer (Окт. 4, 2014 11:59:50)

Офлайн

#3 Окт. 4, 2014 12:41:12

Nata
От:
Зарегистрирован: 2010-10-02
Сообщения: 87
Репутация: +  6  -
Профиль   Отправить e-mail  

Перевод выражения из инфиксной (математической) нотации в обратную польскую (постфиксную) нотацию.

TroSer
+1
а еще убрать половину ненужного кода
 
LL=len(stk)
by=list(stk[LL-1])
vyhod=vyhod+by
==
vyhod.append(stk[-1])

:P
polsk=raw_input("vvedi polskyy ") #infix or postfix in input??? not clear
expr=list(polsk)
za=""
zo=""
vyhod = []
stk = []
for i in range (len(expr)-1):
    if i<len(expr): # what is it for???
        
        symbol=expr[i]
        ln=len(stk)
        if symbol.isdigit() :
            vyhod.append(symbol)    
        
        if ln != 0:
            if symbol == "*" or symbol == "/" and stk[-1] == "+" or stk[-1] == "-":
                stk.insert(0,symbol)
                stk.pop()
                vyhod.append(stk[-1])
                stk.pop()
                expr.remove(symbol)
            else:
                
                if symbol == "+" or symbol == "-" or symbol == "*" or symbol == "/":
                     stk.append(symbol)
        ln=len(stk)
        if ln != 0:
            if symbol == "+" or symbol == "-" and stk[-1] == "*" or stk[-1] == "/":
                stk.insert(0,symbol)
                stk.pop()
                vyhod.append(stk[-1])               
                stk.pop()
                expr.remove(symbol)
            else:
                if symbol == "+" or symbol == "-" or symbol == "*" or symbol == "/":
                     stk.append(symbol)
        else:
             if symbol == "+" or symbol == "-" or symbol == "*" or symbol == "/":
                     stk.append(symbol)
        if symbol == "(":
            ip=i 
            expr.remove(symbol)
            while symbol!= ")":
                ip=ip+1
                symbol=expr[ip]
                ln=len(stk)            
                if symbol.isdigit() :
                    vyhod.append(symbol)
                    expr.remove(symbol)
                    
                else:
                    if symbol == "+" or symbol == "-":
                        stk.append(symbol)
                        expr.remove(symbol)
                    else:
                        if ln != 0:
                            if symbol == "*" or symbol == "/" and stk[-1] == "+" or stk[-1] == "-" :
                                stk.insert(0,symbol)
                                expr.remove(symbol)
                
                print(vyhod,"1..") #???
                print(stk,"1.") #???
            vyhod=vyhod+stk    
            stk.clear()
       
for i in range (len(vyhod)):
		d=str(vyhod[i])
		za=za+d
for i in range (len(stk)):
    da=str(stk[i])
    zo=zo+da    
print (za+zo)  
авторская логика сохранена :P



Отредактировано Nata (Окт. 4, 2014 12:45:48)

Офлайн

#4 Окт. 4, 2014 14:24:39

Mixeyka
Зарегистрирован: 2014-09-19
Сообщения: 32
Репутация: +  1  -
Профиль   Отправить e-mail  

Перевод выражения из инфиксной (математической) нотации в обратную польскую (постфиксную) нотацию.

Nata

Офлайн

  • Начало
  • » Python для новичков
  • » Перевод выражения из инфиксной (математической) нотации в обратную польскую (постфиксную) нотацию.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version