파이썬)연결리스트를 이용한 후위 표기법 만들기
조회수 1322회
열심히 찾아보고 고쳐봤습니다 차근차근 고쳐볼려고하는데 ㅠㅠ.. 어디서 잘못 된걸까요
전역변수로 한이유는 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 )'))
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력