쌓고 쌓다
후위 표기식 계산 - 스택 활용 본문
문자열을 탐색하는데
피연산자(숫자)라면 스택에 그냥 저장해줍니다.
연산자라면 피연산자가 2개 필요하겠죠?
스택에서 피연산자 2개를 꺼냅니다.
먼저 꺼낸 것은 op2 ( 연산자 뒤에 쓸 피연산자)
2번째로 꺼낸것은 op1 ( 연산자 앞에 쓸 피연산자)입니다.
op1, op2를 연산자로 계산하여 스택에 넣어줍니다.
연산자가 / 라면
op1/op2를 스택에 넣어줍니다.
이 과정을 문자열 끝까지 실행 시
스택에는 결괏값만 남아 있을 것입니다.
전체 코드
#include <iostream>
#include <stack>
using namespace std;
int solve(string str)
{
stack<int> s;
int idx = 0;
while (idx < str.length())
{
char ch = str[idx];
if (ch != '+' && ch != '-' && ch != '/' && ch != '*') //피연산자(숫자)인 경우
{
int value = ch - '0';
s.push(value);
}
else // 연산자인 경우
{
int op2 = s.top();
s.pop();
int op1 = s.top();
s.pop();
switch (ch) {
case '+': s.push(op1 + op2); break;
case '-': s.push(op1 - op2); break;
case '*': s.push(op1 * op2); break;
case '/': s.push(op1 / op2); break;
}
}
idx++;
}
return s.top(); // 다 돌면 스택에는 결괏값만 있다~
}
int main(void)
{
cout<<solve("82/3-"); // 결과:1
}
'알고리즘 > 개념' 카테고리의 다른 글
허프만 코드 (0) | 2022.06.04 |
---|---|
최소 공통 조상 알고리즘(LCA, Lowest Common Ancestor) (0) | 2022.05.17 |
후위 표기식 변환 - 스택 활용 (0) | 2022.03.28 |
올바른 괄호 판별 - 스택 활용 (0) | 2022.03.28 |
플로이드 와샬 알고리즘 (0) | 2021.12.24 |
Comments