ÀÚ·á ±¸Á¶ °úÁ¦ÁßÀÎ ºñÀü°øÀÚÀÔ´Ï´Ù. ¾îµð ¹°¾îº¼ °÷µµ ¾ø¾î¼ ³Ê¹« Èûµå³×¿ä. ½ºÅÃÀ» ÀÌ¿ëÇؼ ÈÄÀ§¿¬»êÀÚ °è»ê±â¸¦ ¸¸µå´Â°Çµ¥ ÀÎÅÍ³Ý Ã£¾Æº¸¸é¼ ¾ïÁö·Î Á¤¼ö·Î´Â ¸¸µé¾ú´Âµ¥ ½Ç¼ö °è»ê±â ¸¸µå´Â°Ô ÃÖÁ¾¸ñÇ¥ÀÔ´Ï´Ù.
( 6 / 3 ) + 4 * 0.4 ÀÌ·¸°Ô ÀÎDzÀ» ÁÖ¸é
3.60 ÀÌ·¸°Ô ³ª¿À°Ô ¸¸µé°í ½ÍÀºµ¥ ¹®ÀÚ¿¿¡¼ ½Ç¼ö¸¸ ºÐ¸®ÇÒ¼ö´Â ¾øÀ»±î¿ä?
#include <iostream>
#include <ctype.h>
#include <stdlib.h>
using namespace std;
//ÁßÀ§¸¦ ÈÄÀ§·Î ¹Ù²Ù±â À§ÇÑ ¿¬»ê
class CharStack {
private: //class ³»ºÎ Á¢±Ù
int stack[100];
int top;
public: // ³»ºÎ/¿ÜºÎ Á¢±Ù °¡´É
CharStack() { top = -1; }
void push(char val) { stack[++top] = val; } //stack ¿¡ val °ª ³Ö±â
char pop() { return stack[top--]; } //stack ¿¡ °ª »©±â
int isEmpty() { return top == -1; }
int isFull() { return top == 99; }
char getTop() { return stack[top]; }
};
//intStack -- postfix result ¿¬»êÀ§ÇÑ stack
class IntStack {
private:
int stack[100];
int top;
public:
IntStack() { top = -1; }
void push(int val) { stack[++top] = val; }
int pop() { return stack[top--]; }
int isEmpty() { return top == -1; }
int isFull() { return top == 99; }
};
//calculator class Á¤ÀÇ
class Calculator {
private:
char buffer[80];
char postfix[80];
IntStack s1;
CharStack s2;
void infixTopostfix();
void result();
int priority(char);
public:
void calculate(char[]);
};
int Calculator::priority(char ch) { // ¿¬»êÀÚ¿¡ ¿ì¼±¼øÀ§¸¦ ÁöÁ¤ÇØ ÁØ´Ù
if (ch == ')')
return 4;
else if (ch == '*' || ch == '/')
return 3;
else if (ch == '+' || ch == '-')
return 2;
else
return 1;
}
void Calculator::calculate(char infix[]) { // ÁßÀ§ Ç¥±â¹ýÀÎ ¿¬»êµéÀ» buffer[i]¿¡ ³Ö¾îÁØ´Ù
for (int i = 0; i < 80; i++)
buffer[i] = infix[i];
infixTopostfix();
result();
}
void Calculator::infixTopostfix() { //ÁßÀ§ Ç¥±â¹ý -> ÈÄÀ§ Ç¥±â¹ý
int i = 0, j = 0;
char ch;
while (buffer[i] != NULL) {
if (buffer[i] == ' ') //°ø¹éÀÌ¸é ´ÙÀ½ ¹öÆÛ·Î ³Ñ¾î°£´Ù
i++;
else if (isdigit(buffer[i])) { //buffer[i]ÀÇ °ªÀÌ ¼ýÀÚ¸é postfix¿¡ Ãâ·Â
while (isdigit(buffer[i]))
postfix[j++] = buffer[i++];
postfix[j++] = ' ';
}
else if (buffer[i] == '(') { //½ÃÀÛ °ýÈ£´Â ½ºÅÿ¡ ³Ö¾îÁØ´Ù
s2.push(buffer[i]);
i++;
}
else if (buffer[i] == ')') { //¸¶Ä§ °ýÈ£¸¦ ¹ß°ß ÇÒ¶§±îÁö ¿¬»êÀÚµéÀ» pop
ch = s2.pop();
while (ch != '(') {
postfix[j++] = ch;
postfix[j++] = ' ';
ch = s2.pop();
}
i++;
}
else {
if (s2.isEmpty())
s2.push(buffer[i++]);
else { //½ºÅÿ¡ ÀÖ´Â Àڱ⺸´Ù ³ô°Å³ª °°Àº ¿¬»êÀÚµéÀ» ¸ðµÎ postfix¿¡ Ãâ·ÂÇÏ°í ÀÚ½ÅÀº ½ºÅÿ¡ push
while (!s2.isEmpty() && priority(s2.getTop()) >= priority(buffer[i])) {
ch = s2.pop();
postfix[j++] = ch;
postfix[j++] = ' ';
}
s2.push(buffer[i]);
i++;
}
}
}
while (!s2.isEmpty()) { //¼ö½ÄÀÌ ³¡³ª¸é stack³»¿ë pop
ch = s2.pop();
postfix[j++] = ch;
postfix[j++] = ' ';
}
postfix[j] = NULL;
cout << "postfix : " << postfix << endl;
}
void Calculator::result() {
int i = 0, k;
char token[5];
int num, number, num1, num2;
char ch;
while (postfix[i] != NULL) {
if (isdigit(postfix[i])) {//postfixÀÇ °ªÀÌ ¼ýÀÚ¸é ¹Ýȯ(true), ¿¬»êÀÚ À̸é(false)
k = 0;
while (isdigit(postfix[i]))
token[k++] = postfix[i++];
token[k] = NULL;
num = atoi(token); //¹®ÀÚ¿À» intÇüÀ¸·Î º¯È¯
s1.push(num);
}
else if (postfix[i] == ' ')
i++;
else { //¿¬»êÀÚ´Â ½ºÅÿ¡¼ µÎ ¼ö¸¦ popÇÏ¿© ¿¬»êÇÏ°í ´Ù½Ã push
ch = postfix[i++];
num1 = s1.pop();
num2 = s1.pop();
if (ch == '+') number = num2 + num1;
else if (ch == '-') number = num2 - num1;
else if (ch == '*') number = num2 * num1;
else if (ch == '/') number = num2 / num1;
s1.push(number);
}
i++;
}
if (ch == '(')
cout << "result = " << "°ýÈ£ÀÇ Â¦ÀÌ ¸ÂÁö ¾Ê½À´Ï´Ù" << endl;
else
cout << "result = " << s1.pop() << endl;
}
bool zerotest(char* buffer) {
for (int i = 0; i < 80; i++) {
if (buffer[i] == '/' && buffer[i + 1] == '0') {
return true;
}
}
}
void EraseSpace(char string[]) {
int index = 0;
for (int i = 0; string[i] != 0; i++) {
if (string[i] != ' ') {
string[index] = string[i];
index++;
}
}
string[index] = 0;
}
void main()
{
char infix[80];
Calculator myInput;
cin.getline(infix, 80);
EraseSpace(infix);
if (zerotest(infix) == true)
printf("Error : zero division error\n");
else
myInput.calculate(infix);
}