stack을 이용한다.
피연산자는 push하고, 연산자가 나오면 2개를 pop해 계산한 결과값을 push한다.
최종 stack에 남은 1개의 값이 결과값이다.
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int N; cin >> N;
string cmd; cin >> cmd;
//수식에 입력 집어넣기
char num;
for (int i = 0; i < N; i++) {
cin >> num;
replace(cmd.begin(), cmd.end(), (char)(i + 65), num);
}
//계산
stack<double> stk;
for (int i = 0; i < cmd.size(); i++) {
double A, B;
//연산자 나오면 2개 pop해 계산해서 결과값 push
if (cmd[i] == '+') {
B = stk.top(); stk.pop();
A = stk.top(); stk.pop();
stk.push(A + B);
}
else if (cmd[i] == '-') {
B = stk.top(); stk.pop();
A = stk.top(); stk.pop();
stk.push(A-B);
}
else if (cmd[i] == '*') {
B = stk.top(); stk.pop();
A = stk.top(); stk.pop();
stk.push(A* B);
}
else if (cmd[i] == '/') {
B = stk.top(); stk.pop();
A = stk.top(); stk.pop();
stk.push(A/B);
}
else { //피연산자는 push. 다만 char를 double로 바꿔서
stk.push(double(cmd[i] - '0'));
}
}
cout << fixed; cout.precision(2);
cout << stk.top();
return 0;
}
간과한 점: char는 오로지 1자리 값만 받는다.
10을 입력받는다면 1만 char에 저장된다.
-->수식에 입력을 치환해 놓지 말고, 알파벳 값이 들어오면 그때 상응하는 값으로 바꾸자!
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<stack>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int N; cin >> N;
string cmd; cin >> cmd; //수식 받기
//입력 숫자 받기
vector<int> num; int n;
for (int i = 0; i < N; i++) {
cin >> n;
num.push_back(n);
}
//계산
stack<double> stk;
for (int i = 0; i < cmd.size(); i++) {
double A, B;
//연산자 나오면 2개 pop해 계산해서 결과값 push
if (cmd[i] == '+') {
B = stk.top(); stk.pop();
A = stk.top(); stk.pop();
stk.push(A + B);
}
else if (cmd[i] == '-') {
B = stk.top(); stk.pop();
A = stk.top(); stk.pop();
stk.push(A - B);
}
else if (cmd[i] == '*') {
B = stk.top(); stk.pop();
A = stk.top(); stk.pop();
stk.push(A * B);
}
else if (cmd[i] == '/') {
B = stk.top(); stk.pop();
A = stk.top(); stk.pop();
stk.push(A / B);
}
else { //피연산자는 push
stk.push(double(num[int(cmd[i] - 65)]));
}
}
cout << fixed; cout.precision(2);
cout << stk.top();
return 0;
}
input
3
ABC++
10
20
30
output
60.00