본문 바로가기
프로그래밍/독학(어려워요 같이해요)

파이썬 코딩했는데 계속 에러가 걸리네요

by 노마드데이터랩 2020. 5. 4.
728x90
반응형

안녕하세요. 오늘은 코딩하시다가 디버깅을 요청하신 부분 수정을 해달라는 요청을 받았습니다. 코드 내용은 다음과 같습니다.

def precedence(op):
    if op=='(' or op==')':return 0
    if op=='+' or op=='-':return 1
    if op=='*' or op=='/':return 2
    else: return -1
def Infix2Postfix(expr):
    s=Stack()
    output=[]
    for term in expr :
        if term in '(' :
            s,push('(')
         elif term in ')':
             while not s.isEmpty() :
                 op=s,pop()
                 if op=='(':break;
                 else:
                     output.append(op)
         elif term in "+-*/":
             while not s.isEmpty():
                 op=s,peek()
                 if(precedence(term)<=precedence(op)):
                     output.append(op)
                     s.pop()
                 else:break
            s.push(term)
        else:
            output.append(term)

    while not s.inEmpty():
        output.append(s.pop())

    return output

infix1=['8','/','2'.'-'.'3','+'.'(','3','*','2',')']
infix2=['1','/','2'.'*'.'4','*'.'(','1','/','4',')']
postfix1=Infix2Postfix(infix1)
postfix2=Infix2Postfix(infix2)
result1=evalPostfix(postfix1)
result2=evalPostfix(postfix2)
print('중위표기:',infix1)
print('후위표기:',postfix1)
print('계산결과:',result1,end='\n\n')
print('중위표기:',infix2)
print('중위표기:',postfix2)
print('계산결과:',result2)

하나씩 진단을 해보겠습니다.

우선 if문에 있는 in이라는 내용은 '=='로 변경하였습니다.

IsEmpty()라는 함수는 없어서, 제가 추가를 했구요.

기타 오타들은 제가 수정을 했고,

evalPostfix라는 함수는 없어서 그부분 결과내용은 제외 하였습니다.

그래서 코드 수정을 해보면,

class Stack(list):
    push = list.append # push
    pop = list.pop # pop
    
    def is_empty(self):
        if not self:
            return True
        else:
            return False

def precedence(op):
    if op=='(' or op==')':return 0
    if op=='+' or op=='-':return 1
    if op=='*' or op=='/':return 2
    else: return -1
def Infix2Postfix(expr):
    s=Stack()
    output=[]
    for term in expr :
        if term == '(' :
            s.push('(')
        elif term == ')' :
             while not s.is_empty() :
                 op=s.pop()
                 if op=='(':break;
                 else:
                     output.append(op)
        elif term == "+-*/":
             while not s.is_empty():
                 op=s.peek()
                 if(precedence(term)<=precedence(op)):
                     output.append(op)
                     s.pop()
                 else:break
                 s.push(term)
        else:
            output.append(term)

    while not s.is_empty():
        output.append(s.pop())

    return output

infix1=['8','/','2','-','3','+','(','3','*','2',')']
infix2=['1','/','2','*','4','*','(','1','/','4',')']
postfix1=Infix2Postfix(infix1)
postfix2=Infix2Postfix(infix2)
#result1=evalPostfix(postfix1)
#result2=evalPostfix(postfix2)
print('중위표기:',infix1)
print('후위표기:',postfix1)
#print('계산결과:',result1,end='\n\n')
print('중위표기:',infix2)
print('중위표기:',postfix2)
#print('계산결과:',result2)

입니다.

결과는 다음과 같이 나왔습니다.

오늘은 코드 디버깅에 대해 알아보았습니다. 파이썬 화이팅입니다.~^^

728x90
반응형

댓글