[중위] (A + B) (C + D)
==> AB+CD+
[중위] (A + (B - C)) D
==> ABC -+D
[중위] A (B - (C + D))
==> ABCD +-
prec = {
'*':3,'/':3
'+':2,'-':2,
'(':1
}
def solution(S):
opStack = ArrayStack()
answer = ''
## S 전체 연산을 처음부터 반복하면서 push or pop
for char in S :
## '('이면 스택에 push
if char == '(':
opStack.push(char)
## ')'이면 '('가 나올 때까지 pop, 출력
elif char == ')' :
while opStack.peek() != '(':
answer += opStack.pop()
opStack.pop()
elif char in '+,-,*/':
if opStack.isEmpty():
opStack.push(char)
else:
while opStack.size() > 0:
## dic을 활용해 숫자가 높은 연산자를 먼저 pop한다.
if prec[opStack.peek()] >= prec[char]:
answer += opStack.pop()
else:
break
opStack.push(char)
else :
answer += char
while not opStack.isEmpty() :
answer += opStack.pop()
return answer
for char in S :
if char in prec :
if opStack.isEmpty() :
opStack.pop()
elif char = '(' :
opStack.push(char)
elif prec[char] > prec[opStack.peek()]:
opStack.push(char)
elif prec[char] < prec[onStack.peek()]"
opStack.push(char)
else :
opStack.push(char)
elif char == ')':
while opStack.peek() != '(':
answer += opStack.pop()
opStack.pop()
else:
answer += char
while opStack.isEmpty() == False:
answer += opStack.pop()
return answer
- 예시
def solution(S):
opStack = ArrayStack()
answer = ''
# 전체 수식을 순서대로 반복문에 넣어서 하나씩 비교
for ch in S:
# 하나씩 읽어서 '('이면 스택에 push
if ch is '(':
opStack.push(ch)
# ')'이면 스택에서 pop을 해주는데 마무리 괄호라해서 수식이 끝난 것이 아닐 수 있기 때문에 스택이 비었는지 확인한 후 pop 한다.
elif ch is ')':
while not opStack.isEmpty():
if opStack.peek() is '(':
opStack.pop()
break
else:
answer += opStack.pop()
elif ch in prec:
if opStack.isEmpty():
opStack.push(ch)
# 만약 스택에 있는 연산자의 우선순위가 크다면 pop 우선순위가 작다면 다음 연산자는 스택에 push해준다.
else:
if prec[opStack.peek()]>= prec[ch]:
answer += opStack.pop()
opStack.push(ch)
# answer에 피연산자를 넣어준다.
else:
answer += ch
# 스택이 빌때까지 pop한다.
while not opStack.isEmpty():
answer += opStack.pop()
return answer
- 다른 예시
for c in S:
if c.isalpha():
answer += c
elif c == '(':
opStack.push(c)
elif c == ')':
while opStack.peek() != '(':
answer += opStack.pop()
opStack.pop()
else:
if not opStack.isEmpty():
while not opStack.isEmpty() and prec[c]<= prec[opStack.peek()]:
answer+= opStack.pop()
opStack.push(c)
else:
opStack.push(c)
while not opStack.isEmpty():
answer+= opStack.pop()