파이썬)연결리스트를 이용한 후위 표기법 만들기

조회수 79회

열심히 찾아보고 고쳐봤습니다 차근차근 고쳐볼려고하는데 ㅠㅠ.. 어디서 잘못 된걸까요

전역변수로 한이유는 SIZE 랑 TOP을 어디서든 쓰기 위해서 선언한거 입니다!! 제가 의도한 부분은 이것입니다 input_expr을 받아와 split으로 하나하나 쪼개어 숫자면 r 이라는 linkedlist에 저장하고 연산자면 우선순위를 비교해 서 처리하고 처리한걸 다시 r 에 저장해서 후위 표기법을 만들려고 하는것 입니다 ㅜㅜ

아마 막힌 부분은 후위 표기법을 변환할때 .split을 이용해 하나하나 때어서 가져와서 거기에 연산자를 우선순위에 따라 바꿔볼려고했는데 .. .

//여기에 코드를 입력하세요
class stack2:
    class Node:
        def __init__(self,item,link):
            self.item = item
            self.next = link

    def push(item):
        global top
        global size
        top = Node(item,top)
        size += 1

    def peek():
        if size != 0:
            return top.item
    def pop():
        global top
        global size
        if size !=0:
            top_item = top.item
            top = top.next
            size -=1
            return top_item
    def size(self): return self.size

    def is_empty(self): return self.size ==0


def isNumber(item):          

    try:
        float(item)          

    except ValueError:   
        return False



def infix_to_postfix(input_expr):  #전위표기법을 후위 표기법으로 바꾸는 함수를 선언해줬습니다.
    precedence = {}                #이 함수안에 연산자를 위한 리스트를 선언해줍니다
    precedence['*'] = 3            #이제 연산자의 우선순위를 정합니다 곱하기는 3으로 선정해줍니다.
    precedence['/'] = 3            #나누기 또한 곱하기와 같은 우선순위로 3 으로 선정해줍니다.
    precedence['+'] = 2            # +기는 곱하기와 나누기 보다 한단계 낮은 2 로 선정해줍니다.
    precedence['-'] = 2            #-는 +와 같은 우선순위인 2로 선정해줍니다.
    precedence['('] = 1                          

    token_list =input_expr.split()

    for token in token_list:       #이제 for 문을 돌려 숫자와 연산자를 구분해 보겠습니다
        if isNumber(token)==True:  #위에서 만든 is Number 함수를 통해 token을 넣고 그값이 숫자이면 true를 보내줍니다.만약 token이 숫자이면
                                  #그값은 is number 함수 안에서 실수형으로 표시됩니다
            r.push(token)  #실수 형으로 표시된 숫자  token 값을 result 값에 추가 시킵니다 
        elif token =='(':          # 이제 (연산자를 만들어보겠습니다   만약 가로연산자가 처음에 (가 나오면
            s.push(token)            # 계속해서 token 안에 들어있는 모든 것들을 push 시킵니다  
        elif token == ')':         # 그리고만약 token 값이 )이나오면
            top=s.pop()              #스택상에 맨 위에있는 부분을 pop시킵니다
            while top != '(':      # 이제 이 밑에 있는 부분은 종합적으로 (가 나오면 그 안에있는 모든 값들을 pop시킵니다 이 과정을 )나올떄까지 다 pop 시킵니다 
                r.push(top)
                top=s.pop()
        else:                     
            while (s.size !=0) and (precedence[s.peek()]>=precedence[token]):  
                r.push(s.pop())                                            
            s.push(token)

    while s.size != 0: 
        r.push(s.pop())  


s = stack2()
r = stack2()
top= None
size = 0
print(infix_to_postfix('34.5 * 23.4 + 23 * ( 32 + 46 )'))



  • self.size는 클래스 내에서 선언한 적이 없는데 사용하고 계십니다. 그리고 두 스택이 top과 size를 공유해야 하는 이유는 뭔가요? HIAOAIH 2020.6.26 17:14
  • 아아 self.size는 따로 선언 하겠습니다 top 과 size를 생각해보니 공유할 필요가 없을것 같습니다.. 그러면 top과 size를 지역변수로 돌리겠습니다 ㅠㅠ 이이이다다 2020.6.26 17:16
  • 이렇게 수정해서 돌리면 원하는 값이 나올까요 ?ㅠㅠ 이이이다다 2020.6.26 17:17

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.