๋ฐ์ํ
๊ดํธ, ์ฌ์น์ฐ์ฐ ์ฐ์ ์์ ์ฒ๋ฆฌํ๋ ๊ณ์ฐ๊ธฐ ์์ค ๊ณต์ ํฉ๋๋ค.
ํ์ํ๊ธฐ๋ฒ๊ณผ Stack ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ์ต๋๋ค.
์๋ฒฝํ๊ฒ ์์ธ์ฒ๋ฆฌ ๋ ๋ถ๋ถ์ด ์๋๋ผ ์ฐธ๊ณ ํ์๋ฉด ์ข๊ฒ ์ต๋๋ค.
package test;
import java.util.ArrayList;
import java.util.Stack;
/**
* ๊ณ์ฐ ์๋น์ค
*
* @author
* @version
* @since
* @created 2015. 1. 12.
*/
public class CalculatorService {
public static void main(String[] args) {
String result = getCalculate("(10 + 20) * 10");
System.out.println(result);
}
/**
* ๊ณ์ฐ์ฒ๋ฆฌ
*/
private static String getCalculate(String content) {
char[] operationCode = {'+', '-', '*', '/', '(', ')'}; //์ฐ์ฐ ๋ถํธ
ArrayList<String> postfixList = new ArrayList<String>(); //ํ์ํ๊ธฐ๋ฒ์ผ๋ก ๋ณํ ํ ์ ์ฅ ํ ArrayList
Stack<Character> opStack = new Stack<Character>(); // ์ฐ์ฐ ๋ถํธ ์ฐ์ ์์์ฒ๋ฆฌ ํ๋ฉฐ ํ์ ํ๊ธฐ๋ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ Stack
Stack<String> calculatorStack = new Stack<String>(); //ํ์ ํ๊ธฐ๋ฒ์ ๊ณ์ฐํ๋ Stack
int index = 0;//content.substring() ์ธ์
for (int i = 0; i < content.length(); i++) {
for (int j = 0; j < operationCode.length; j++) {
if (content.charAt(i) == operationCode[j]) { //๋ฌธ์์ด๊ณผ ์ฐ์ฐ ๋ถํธ ๋น๊ต
//postfixList์ ์ฐ์ฐ ๋ถํธ๊ฐ ๋์ค๊ธฐ ์ ๊น์ง์ ์ซ์๋ฅผ ๋ด๋๋ค(๊ณต๋ฐฑ์ ๊ฑฐ)
postfixList.add(content.substring(index, i).trim().replace("(", "").replace(")", ""));
if (content.charAt(i) == '(') {
if (content.charAt(i) == ')') {//์ฐ ๊ดํธ๊ฐ ๋์ค๋ฉด ์ข ๊ดํธ๊ฐ ๋์ค๊ฑฐ๋ ์คํ์ ๋น์ด์์๋ ๊น์ง popํ์ฌ list์ ์ ์ฅ
while (true) {
postfixList.add(opStack.pop().toString());
if (opStack.pop() == '(' || opStack.isEmpty()) {
break;
}
}
}
}
if (opStack.isEmpty()) { //opStack์ด ๋น์ด ์์ ๊ฒฝ์ฐ
opStack.push(operationCode[j]); //์ฐ์ฐ ๋ถํธ ์ ์ฅ
} else { //opStack์ด ๋น์ด ์์ง ์์ ๊ฒฝ์ฐ
if (opOrder(operationCode[j]) > opOrder(opStack.peek())) { //์ฐ์ ์์ ๋น๊ต
opStack.push(operationCode[j]); //์คํ์ top ๊ฐ ๋ณด๋ค ๋์ ์ฐ์ ์์์ด๋ฉด ๊ทธ๋๋ก ์ ์ฅ
} else if (opOrder(operationCode[j]) <= opOrder(opStack.peek())) {//์ฐ์ ์์ ๋น๊ต
postfixList.add(opStack.peek().toString());//์คํ์ ์๋ ๊ฐ์ด ์ฐ์ ์์๊ฐ ๊ฐ๊ฑฐ๋ ์์ ๊ฒฝ์ฐ list์ ์ ์ฅ
opStack.pop();//์คํ ์ ๊ฑฐ
opStack.push(operationCode[j]);//๋์ ์ฐ์ ์์ ์ฐ์ฐ ๋ถํธ ์คํ์ ์ ์ฅ
}
}
index = i + 1;// ๋ค์ ์์ ์ฒ๋ฆฌ
}
}
}
postfixList.add(content.substring(index, content.length()).trim().replace("(", "").replace(")", "")); //๋ง์ง๋ง ์ซ์ ์ฒ๋ฆฌ
if (!opStack.isEmpty()) { //Stack์ ๋จ์์๋ ์ฐ์ฐ ๋ชจ๋ postfixList์ ์ถ๊ฐ
for (int i = 0; i < opStack.size();) {
postfixList.add(opStack.peek().toString());
opStack.pop();
}
}
//list์ ๊ณต๋ฐฑ, ๊ดํธ ์ ๊ฑฐ
for (int i = 0; i < postfixList.size(); i++) {
if (postfixList.get(i).equals("")) {
postfixList.remove(i);
i = i - 1;
} else if (postfixList.get(i).equals("(")) {
postfixList.remove(i);
i = i - 1;
} else if (postfixList.get(i).equals(")")) {
postfixList.remove(i);
i = i - 1;
}
}
System.out.println(postfixList);
opStack.clear(); //Stack ๋น์ฐ๊ธฐ
//postfixList๋ฅผ calculatorStack์ ์ ์ฅํ๋ฉด์ ํ์์ฐ์ฐ ์ฒ๋ฆฌ
for (int i = 0; i < postfixList.size(); i++) {
calculatorStack.push(postfixList.get(i));
for (int j = 0; j < operationCode.length; j++) {
if (postfixList.get(i).charAt(0) == operationCode[j]) { //์ฐ์ฐ ๋ถํธ ๋น๊ต
calculatorStack.pop(); //stack์ ์ ์ฅ๋ ์ฐ์ฐ ๋ถํธ ์ ๊ฑฐ
double s2, s1; //stack์์ pop ๋๋ ๊ฐ๋ค์ ์ ์ฅํ ๋ณ์
String rs; // ์ฐ์ฐ ์ฒ๋ฆฌ ํ ๋ฌธ์์ด๋ก ๋ณํ ํ stack์ ์ ์ฅํ ๋ณ์
s2 = Double.parseDouble(calculatorStack.pop()); //์คํ์์ popํ์ฌ ๋ฌธ์์ด์ ์ซ์๋ก ํ๋ณํ
s1 = Double.parseDouble(calculatorStack.pop());
//์ฐ์ฐ ๋ถํธ์ ํด๋นํ๋ ์ฐ์ ์ฒ๋ฆฌ ํ stack์ ์ ์ฅ
switch (operationCode[j]) {
case '+':
rs = String.valueOf(s1 + s2);
calculatorStack.push(rs);
break;
case '-':
rs = String.valueOf(s1 - s2);
calculatorStack.push(rs);
break;
case '*':
rs = String.valueOf(s1 * s2);
calculatorStack.push(rs);
break;
case '/':
rs = String.valueOf(s1 / s2);
calculatorStack.push(rs);
break;
}
}
}
}
double re = Double.parseDouble(calculatorStack.peek()); //Stack Top ๋ฐ์ดํฐ
String result = String.format("%.10f", re); //์์์ 10์งธ์ง๋ฆฌ
//์ ์ ๋ถ๋ถ ์๋ฆฌ ๊ตฌํ๊ธฐ
int num = 0;
for (int i = 0; i < result.length(); i++) {
if (result.charAt(i) == '.') {
num = i;
break;
}
}
//์ ์๋ถ๋ถ
String mok = result.substring(0, num);
//๋๋จธ์ง ์ฐ์ฐ
double divde = Double.parseDouble(result) % Double.parseDouble(mok);
//๋๋จธ์ง๊ฐ 0์ด๋ฉด ์์์ ์๋ฆฟ ์ ์๋ณด์ด๊ฒ
if (divde == 0) {
result = String.format("%.0f", re);
}
return result;
}
/**
* ์ฐ์ฐ ๋ถํธ ์ฐ์ ์์ ์ ํ๋ ๋ฉ์๋
*
* @param op - ์ฐ์ฐ ๋ถํธ
*/
public static int opOrder(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return -1;
}
}
}
๊ณ์ฐ ๊ฒฐ๊ณผ
[10, 20, +, 10, *]
300