ν°μ€ν 리 λ·°
c++: νμ ννμ ꡬννκΈ°
dirmathfl 2022. 2. 20. 23:43μ»΄ν¨ν°μμ κ΄νΈκ° ν¬ν¨λ μ°μ°μ μ½κ² μ²λ¦¬νκΈ° μν΄μλ, μ€μ ννμ(Infix)λ³΄λ€ νμ ννμ(Postfix)μ ν΅ν΄ κ³μ°νλ©΄ μ½κ² μ²λ¦¬ν μ μλ€. μ΄λ Stackμ ν΅ν΄ μ½κ² ꡬνν μ μμΌλ©°, λ³νν μμ κ³μ°νλ κ²μ μ΄λ ΅μ§ μλ€.
Stackμ μ¬μ©νμ¬ κ΅¬ν
νμ ννμ λ³ν
int priority(char c)
{
if (c == '(')
return 0;
else if (c == '+' || c == '-')
return 1;
// *, / μΈ κ²½μ°
return 2;
}
string changePostfix(string target)
{
stack<char> s;
string prefix;
for (int i = 0; target[i]; i++) {
if (target[i] == '(')
s.push('(');
else if (target[i] == ')') {
while (s.top() != '(') {
prefix += s.top();
s.pop();
}
s.pop();
}
else if (target[i] == '+' || target[i] == '/' || target[i] == '*' || target[i] == '-') {
while (!s.empty() && priority(target[i]) <= priority(s.top())) {
prefix += s.top();
s.pop();
}
s.push(target[i]);
}
else { // νΌμ°μ°μ.
prefix += target[i];
}
}
while (!s.empty()) {
prefix += s.top();
s.pop();
}
return prefix;
}
νμ ννμμ μ€νμ μ¬μ©νμ¬ λ³νν λ 쑰건μ λ€μκ³Ό κ°λ€.
- `νΌμ°μ°μ`μΈ κ²½μ° λ°λ‘ μΆλ ₯νλ€.
- μ°μ°μκ° λ€μ΄μ€λ©΄ `μ°μ μμκ° λκ±°λ κ°μ κ²μ μ μΈ`νκ³ μ€νμ push νλ€.
- `μ¬λ κ΄νΈ'('`κ° λ€μ΄μ¨ μ΄νλ‘λ 무쑰건 μ€νμ push νλ€.
- `λ«λ κ΄νΈ')'`κ° λ€μ΄μ€λ©΄ `'('`μΌ λκΉμ§ μ€νμμ pop νλ€.
νμ ννμ κ³μ°
int vars[26];
int calcPostfix(string target) {
stack<int> s;
for (int i = 0; target[i]; i++) {
if (isdigit(target[i]) || isalpha(target[i])) {
int curNum = !isalpha(target[i]) ? target[i] - '0' : vars[target[i] - 'A'];
s.push(curNum);
}
else {
int op2 = s.top();
s.pop();
int op1 = s.top();
s.pop();
switch (target[i]) {
case '+': s.push(op1 + op2); break;
case '-': s.push(op1 - op2); break;
case '*': s.push(op1 * op2); break;
case '/': s.push(op1 / op2); break;
}
}
}
return s.top();
}
νμ ννμμ κ³μ°νλ λ° μμ΄, μ°μ°μ λ§κ³ μμμ `A, B, C`μ κ°μ λ³μλ€κ³Ό μΌλ°μ μΈ μ«μκ° μλ κ²½μ°μλ κ³μ°ν μ μλλ‘ νμλ€. μ°μ κ°μ κ³μ°νκΈ° μν΄μ μ€μν κ²μ stackμ intνμΌλ‘ μ μΈνμ¬μΌ νλ€λ κ²μ΄λ€. λν `cctype`μ μ μΈλ `isdigit`, `isalpha`, `isalpha`λ₯Ό μ¬μ©νμ¬μ λ³μμΈμ§, μ«μμΈμ§ ꡬλΆνμ¬μ μ²λ¦¬νλ©΄ λλ€.
varsλ A ~ ZκΉμ§μ λ³μλ€μ κ°μ μ μ₯νκΈ° μν λ³μμ΄λ€. μ΄μ λν μΈλ±μ€ μ κ·Όμ `vars[λ¬Έμ - 'A']`μ κ°μ΄ μ κ·Όνλ©΄ λλ€. μ«μμ κ²½μ° intνμΌλ‘ λ³ννκ³ μ ν λ, `λ¬Έμ - '0'`μ ν΅ν΄ λ³νν μ μλ€.
// μ«μμΈ κ²½μ°.
if ('0' <= target[i] && target[i] <= '9) {
// Do something.
}
// A ~ ZμΈ κ²½μ°
else if ('A' <= target[i] && target[i] <= 'Z') {
// Do something
}
// μ°μ°μμΈ κ²½μ°
else {
// Do something
}
λ³λμ `include` μμ΄, stringμ index λ³λ‘ μ κ·Όνκ² λλ©΄ charμ΄λ―λ‘, μμ κ°μ΄ μ«μ, λ¬Έμ, μ°μ°μ ꡬλΆλ κ°λ₯νλ€.
λ³νν νμ ννμμ κ³μ°νλ κ³Όμ μ κ°λ¨νλ€.
- `νΌμ°μ°μ`μΈ κ²½μ° stackμ push νλ€.
- `μ°μ°μ`μΈ κ²½μ° stackμμ 2κ°μ μλ₯Ό pop νμ¬ κ³μ°νλ€.
- κ³μ°λ κ°μ stackμ push νλ€.
- λ§μ§λ§μ stackμ λ¨λ κ°μ΄ μ΅μ’ κ³μ° κ°μ΄λ€.
μ 체 μ½λ
#include <stack>
#include <string>
#include <cctype>
#include <sstream>
#include <iostream>
using namespace std;
int vars[26];
int priority(char c)
{
if (c == '(')
return 0;
else if (c == '+' || c == '-')
return 1;
// *, / μΈ κ²½μ°
return 2;
}
string changePostfix(string target)
{
stack<char> s;
string prefix;
for (int i = 0; target[i]; i++) {
if (target[i] == '(')
s.push('(');
else if (target[i] == ')') {
while (s.top() != '(') {
prefix += s.top();
s.pop();
}
s.pop();
}
else if (target[i] == '+' || target[i] == '/' || target[i] == '*' || target[i] == '-') {
while (!s.empty() && priority(target[i]) <= priority(s.top())) {
prefix += s.top();
s.pop();
}
s.push(target[i]);
}
else { // νΌμ°μ°μ.
prefix += target[i];
}
}
while (!s.empty()) {
prefix += s.top();
s.pop();
}
return prefix;
}
int calcPostfix(string target) {
stack<int> s;
for (int i = 0; target[i]; i++) {
if (isdigit(target[i]) || isalpha(target[i])) {
int curNum = !isalpha(target[i]) ? target[i] - '0' : vars[target[i] - 'A'];
s.push(curNum);
}
else {
int op2 = s.top();
s.pop();
int op1 = s.top();
s.pop();
switch (target[i]) {
case '+': s.push(op1 + op2); break;
case '-': s.push(op1 - op2); break;
case '*': s.push(op1 * op2); break;
case '/': s.push(op1 / op2); break;
}
}
}
return s.top();
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
string test = "5+A*(B+C)";
vars[0] = 7; // A = 7
vars[1] = 10; // B = 10
vars[2] = 15; // C = 15
string post = changePostfix(test);
cout << post << endl;
cout << calcPostfix(post) << endl;
}
λ§κ° μλλ μκ°λ³΄λ€ λΉ λ₯΄λ€..
- 2020.06.24 - [π¨π» μ½λ©ν μ€νΈ/λ°±μ€] - λ°±μ€: 1918 νμ νκΈ°μ
- 2020.06.24 - [π¨π» μ½λ©ν μ€νΈ/λ°±μ€] - λ°±μ€: 1935 νμ νκΈ°μ2
μ½, 2λ μ μ―€μ λ¬Έμ νμ΄λ₯Ό μν΄ κ³΅λΆλ₯Ό νλ€... λ§κ° μλκ° λΉ¨λΌμ μμ΄λ²λ¦¬κ³ λ€μ 곡λΆνκ² λλ κ²μ λ°λ³΅νκ³ μλ€.
'πββοΈ νλ‘κ·Έλλ° μΈμ΄ > C++' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
C++: substr, split νμ©νκΈ° (0) | 2022.02.13 |
---|---|
C++: Trie ꡬννκΈ° (0) | 2022.01.30 |
C++: Priority Queue ꡬννκΈ° (0) | 2022.01.05 |