편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2020.06.26

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


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

    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 )'))# 마지막은 위에서 만든 함수를 통해 함수에 우리가원하고자하는 값을 넣고 그값을 화면에 출력해주는것 입니다.
    
    
    
  • 프로필 알 수 없는 사용자님의 편집
    날짜2020.06.25

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


    안녕하세요 나름대로 열심히했는데 오류가 자꾸 뜹니다 오류내용은 이렇습니다 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 )'))# 마지막은 위에서 만든 함수를 통해 함수에 우리가원하고자하는 값을 넣고 그값을 화면에 출력해주는것 입니다.