파이썬)연결리스트를 이용한 스택 구현후 구현된 스택을 이용하여 후위표기법 표현

조회수 958회

안녕하세요 나름대로 열심히했는데 오류가 자꾸 뜹니다. 오류내용은 이렇습니다

TypeError: peek() takes 0 positional arguments but 1 was given

혹시 코딩 내용도 같이 올리는데 수정 부탁드릴수있을까요?

//여기에 코드를 입력하세요
class stack:
    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
class result:
    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                          
    r=result()                      
    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 =='(':          # 이제 (연산자를 만들어보겠습니다   만약 가로연산자가 처음에 (가 나오면
            push(token)            # 계속해서 token 안에 들어있는 모든 것들을 push 시킵니다  
        elif token == ')':         # 그리고만약 token 값이 )이나오면
            top=pop()              #스택상에 맨 위에있는 부분을 pop시킵니다
            while top != '(':      # 이제 이 밑에 있는 부분은 종합적으로 (가 나오면 그 안에있는 모든 값들을 pop시킵니다 이 과정을 )나올떄까지 다 pop 시킵니다 
                r.push(top)
                top=pop()
        else:                     
            while (s.size !=0) and (precedence[s.peek()]>=precedence[token]): # 이제 이 줄의 코딩내용은 아까 위에 선언했던 우선순위를 이용해 우선순위가 자기자신보다 
                r.push(s.pop())                                            #더 낮은 연산자는 다 끄집어 내고 자기 자신이 그 스택안으로 들어가는것을 구현하기 위함입니다.
            push(token)

    while len(stack) != 0:#이제 이 모든 과정을 다하고 마지막에 스택에 남아있는 모든 값들을 pop하기 위함입니다
        result.push(s.pop()) #즉 stack의 길이가 0이될때까지 계속 pop하여 result 값에 그 값을 계속 append합니다 


s =stack() 
top= None
size = 0
print(infix_to_postfix('34.5 * 23.4 + 23 * ( 32 + 46 )'))# 마지막은 위에서 만든 함수를 통해 함수에 우리가원하고자하는 값을 넣고 그값을 화면에 출력해주는것 입니다.


  • 클래스나 메소드 사용 원리를 잘 모르는 상태로 쓰려고 해서 혼란이 있으신 듯 합니다. 예를 들어서 stack과 result는 구조상 같은 클래스인데 따로 선언해서 각각 다른 변수에 선언한다던지(문제가 발생하는 건 아니지만 중복해서 작성할 필요는 없습니다), 클래스 메소드를 함수처럼 사용한다던지, top을 클래스변수를 사용하는 것이 아니라 전역변수를 가져와서 사용한다던지... 지금 단계에서는 작성하신 코드가 돌아가도록 고치는것보다는 부족한 부분을 다시 공부하신 후에 새로 만들어 보시는 것이 좋을 것 같습니다. HIAOAIH 2020.6.26 10:36
  • 감사합니다!! 알 수 없는 사용자 2020.6.26 14:40
  • 혹시 계속해서 피드백좀 받고싶은데 ㅠㅠ 혹시 이메일 주소나 오픈 채팅 알려주실수 있으신가요 ?ㅠㅠ 알 수 없는 사용자 2020.6.26 14:47
  • 파이썬 문법 제대로 이해하고 나신 후에 다시 작성해보시고 그래도 막히면 다시 질문 올리세요 확인하고 답변드릴게요 HIAOAIH 2020.6.26 15:51
  • 올렸습니다 나름대로 해봤는데 ㅠㅠ... 확인 부탁드립니다 알 수 없는 사용자 2020.6.26 16:08

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

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)