RawInput=list(input())
Input=[]
I=''
i=0
while i<=len(RawInput)-1:
I=''
if RawInput[i]!="+"and RawInput[i]!="-" and RawInput[i]!="*" and RawInput[i]!="/" and RawInput[i]!="(" and RawInput[i]!=")":
while RawInput[i]!="+" and RawInput[i]!="-" and RawInput[i]!="*" and RawInput[i]!="/" and RawInput[i]!="(" and RawInput[i]!=")":
I=I+RawInput[i]
i+=1
if i>len(RawInput)-1:
break
Input.append(I)
else:
Input.append(RawInput[i])
i+=1
Ls=["&"]
Ln=[]
for i in range(len(Input)):
if Input[i]!='+' and Input[i]!='-' and Input[i]!='*'and Input[i]!='/' and Input[i]!="(" and Input[i]!=")": #Input[i]가 기호가 아닐 때
Ln.append(Input[i])
else: #Input[i]가 기호일때
if Input[i]=='+' or Input[i]=='-': #입력 받은 기호가 +, - 일 경우
while True:
if Ls[-1]=="(" or Ls[-1]==")": #직전 들이 +,-보다 가치가 낮을 경우까지 반복 혹은 괄호를 만나거나
break
Ln.append(Ls[-1])
if Ls[-1]=="&":
Ln.pop()
Ls.pop()
if len(Ls)==0:
break
Ls.append(Input[i])
elif Input[i]=='*' or Input[i]=='/': #입력 받은 기호가 *, / 인 경우
while True:
if Ls[-1]=="+" or Ls[-1]=="-":
break
elif Ls[-1]=="(" or Ls[-1]==")":
break
else:
Ln.append(Ls[-1])
if Ls[-1]=="&":
Ln.pop()
Ls.pop()
if len(Ls)==0:
break
Ls.append(Input[i])
else: #입력 받은 기호가 괄호 일 때
Ls.append(Input[i])
for i in range(len(Ls)): #Ln에 Ls 집어넣기, 괄호 미포함
if Ls[-1]!='(' and Ls[-1]!=')':
Ln.append(Ls[-1])
Ls.pop()
else:
Ls.pop()
Equation=[]
num1=0
num2=0
for i in range(len(Ln)):
if Ln[i]!='+' and Ln[i]!='-' and Ln[i]!='*'and Ln[i]!='/' and Ln[i]!="(" and Ln[i]!=")":
Equation.append(Ln[i])
elif Ln[i]=='+':
num1, num2 = float(Equation[-1]), float(Equation[-2])
Equation.pop()
Equation.pop()
Equation.append(num1+num2)
elif Ln[i]=='-':
num1, num2 = float(Equation[-1]), float(Equation[-2])
Equation.pop()
Equation.pop()
Equation.append(num2-num1)
elif Ln[i]=='*':
num1, num2 = float(Equation[-1]), float(Equation[-2])
Equation.pop()
Equation.pop()
Equation.append(num1*num2)
elif Ln[i]=='/':
num1, num2 = float(Equation[-1]), float(Equation[-2])
Equation.pop()
Equation.pop()
Equation.append(num2/num1)
print("계산 결과는 %.2f 입니다." %Equation[0])
물론 IDLE 쉘에 입력만해도 자동계산 해주긴 하지만 연습 삼아 +, -, (, ), *, / 연산까지 가능한 계산기를 만들어봄.
근데 계산기는 stack 활용해서 만드는게 아니였음?
친구가 누가 계산기를 이렇게 만듦;; 이러는데 맞지 않나?