๋ฌธ์
Infix expression์ Postfix expression์ผ๋ก ๋ณํํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๋ฌธ์ ํฌ์ธํธ
1) stack class๋ฅผ ๊ตฌํํ ์ ์๋๊ฐ
2) stack์ ๊ธฐ๋ณธ ์ฑ์ง(push, pop, top_element ๋ฑ)์ ์๊ณ ๊ตฌํํ ์ ์๋๊ฐ
3) bool ํ์ + ์กฐ๊ฑด๋ฌธ์ด ๋ค์ด๊ฐ ํจ์๋ฅผ ๊ตฌํํ ์ ์๋๊ฐ
4) infix ์ postfix๋ฅผ ์ดํดํ๋๊ฐ
5) mainํจ์ ์ธ ๋ค๋ฅธ ํจ์๋ฅผ ๊ตฌํํ๊ณ ์ด๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉํ ์ ์๋๊ฐ
6) ์ฌ์ฉ์ ์ง์ ์ฐ์ ์์๋ฅผ ๋ง๋ค์ด ์ด๋ฅผ ๋ฐ์ํ๋ ํจ์ ์กฐ๊ฑด๋ฌธ์ ๊ตฌํํ ์ ์๋๊ฐ
#include <iostream>
#include <stack>
#define SIZE 100
#define EOS '$'
using namespace std;
class op_stack {
char s[SIZE];
int top;
public:
op_stack();
void push(char x);
char pop();
bool empty();
char top_element();
};
// ์ด๊ธฐํ
op_stack:: op_stack() {
top = 0 ;
}
void op_stack:: push(char x) {
s[top] = x;
top++;
}
char op_stack::pop() {
top--;
return(s[top]);
}
bool op_stack::empty() {
return(top == 0);
}
char op_stack::top_element(){
return(s[top-1]);
}
// operand์ธ์ง ์๋์ง ํ์ธ
bool is_operand(char ch){
if(((ch == '(') || (ch == ')')) || (ch == '+') || (ch == '-') ||
(ch == '*') || (ch == '/') || (ch == '%') || (ch == '$'))
return true;
else
return false;
}
// ์ฐ์ ์์ ๊ตฌํ๋ ํจ์ 0>1>2 -> ๋์์๋ก ๋น ๋ฆ
// ์ซ์๊ฐ ๋์๊ฒ๋ถํฐ ํ
int get_precedence(char op) {
if((op == '$') || (op == '(') || (op == ')') ) return (0);
if ((op == '+') || (op == '-')) return (1);
if((op == '*') || (op == '/') || (op == '%')) return(2);
return (-1);
}
// infix -> postfix ํจ์
string in_to_post(string input) {
string output = "";
op_stack stack1;
stack1.push(EOS);
for(int i=0; i<input.size(); i++) {
char ch = input[i];
// ํ์ฌ ๋ฌธ์๊ฐ ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ - output๋ฌธ์์ด์ ์ถ๊ฐ
if(!is_operand(ch)) {
output = output + ch;
}
// ๋ถํธ ์ค ์ฌ๋ ๊ดํธ ์คํ์ ๋ฃ๊ธฐ
else if(ch == '(') {
stack1.push(ch);
}
// ๋ถํธ ์ค ๋ซ๋ ๊ดํธ
// -> ์คํ์ด ๋น์ด์์ง์๊ณ ํ ์์๊ฐ ์ฌ๋ ๊ดํธ๊ฐ ์๋๋ฉด ๋ฌธ์์ด์ ์ถ๊ฐํ๊ธฐ
else if(ch == ')') {
while(!stack1.empty() && stack1.top_element() != '(') {
output = output + stack1.pop();
}
// -> ์คํ์ด ๋น์ด์์ง์๊ณ ํ ์์๊ฐ ์ฌ๋ ๊ดํธ๋ฉด ์คํ1์์ ๋นผ๊ธฐ
if (!stack1.empty() && stack1.top_element() == '(') {
//cout << stack1.pop(); //์ถ๋ ฅ ํ์ธ์ฉ
stack1.pop();
}
}
// ๋ฌธ์์ด๋ ์๋๊ณ ๊ดํธ๋ ์๋๊ณ ์ผ๋ฐ ๋ถํธ์ผ๋ - ์คํ์ด ๋น์ด์์ง์์ ์ํ์์ ์ฐ์ ์์๋ฅผ ํ์ธํ๊ณ ์คํ์ ์ถ๊ฐ
else {
while (!stack1.empty() && get_precedence(ch) <= get_precedence(stack1.top_element())){
output = output + stack1.pop();
}
stack1.push(ch);
}
}
// ๋๋ ๋๊น์ง ์ถ๋ ฅ
while(stack1.top_element()!=EOS){
output += stack1.pop();
}
//cout << output ;
// output ๋๊ฒจ์ฃผ๊ธฐ
return output;
}
int main() {
string infix;
cout << "input an infix expression to convert : ";
cin >> infix;
cout << "postfix : " << in_to_post(infix) << endl;
cout << endl;
return 0;
}
'๋ฌธ์ ํ์ด๐ฉ๐ปโ๐ป' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[python] ๋ฆฌ์คํธ ์ ์ฅ ๊ณ์ฐ ๋ฐ ํจ์ ๋ชจ๋ํ (1) | 2024.11.05 |
---|---|
[c++] stack class๋ฅผ ๊ตฌํํ์ฌ ์ฃผ์ด์ง ๋ฐฐ์ด์100๋ณด๋ค ํฐ ๊ฐ ์ญ์์ผ๋ก ์ถ๋ ฅํ๊ธฐ (0) | 2023.09.24 |