2. 연산자가 맞으면 스택에 넣는다.
a. push할 연산자가 스택 탑에 있는 연산자보다 우선순위가 높다면, pop하고 push한다.
b. push할 연산자가 스택 탑에 있는 연산자보다 우선순위가 낮다면, push한다.
3. '(' 여는 괄호를 만나면, 무조건 스택에 넣는다.
4. ')' 다는 괄호를 만나면, 스택에서 '(' 여는 괄호가 나올 때까지 계속 pop한다.
5. 이를 반복한다.
package com.em.util;
import java.util.Stack;
public class ReversePolishNotationCreater {
private Stack<Character> stack;
private StringBuffer sbuf;
private boolean isOperatorAdded = false;
private String spliter;
public ReversePolishNotationCreater() {
stack = new Stack<>();
sbuf = new StringBuffer();
spliter = ",";
}
public String getSpliter(){
return spliter;
}
public void setSpliter(String spliter){
this.spliter = spliter;
}
public void createNotation(String expr){
sbuf.delete(0, sbuf.length());
char[] carr = expr.toCharArray();
for(char c : carr){
switch(c){
case '+': case '-': case '*': case '/':
if(isBigPriority(c)){
if(!stack.empty()){
sbuf.append(",");
sbuf.append(stack.pop());
}
}
stack.push(c);
isOperatorAdded = true;
break;
case '(':
stack.push(c);
break;
case ')':
char d = stack.pop();
while(d != '('){
sbuf.append(",");
sbuf.append(d);
d = stack.pop();
}
break;
default:
sbuf.append(c); //문자 입력
break;
}
System.out.println(stack);
if(isOperatorAdded){
sbuf.append(",");
isOperatorAdded = false;
}
}
while(!stack.empty()){
sbuf.append(",");
sbuf.append(stack.pop());
}
}
public String getReversePolishNotation(){
return sbuf.toString();
}
/**
*
* @param c
* @return true면 인자가 우선순위 높음.
*/
private boolean isBigPriority(char c){
if(stack.empty()){
return false;
}
boolean reValue = false;
if(c == '+' || c == '-'){
char k = stack.peek();
if( k == '('){
return false;
}
reValue = true;
}
if(c == '*' || c == '/'){
char k = stack.peek();
if( k == '('){
return false;
}
if( k == '+' || k == '-'){
reValue = false;
} else {
reValue = true;
}
}
return reValue;
}
}
-----------------------------------------------------------------
1. 연산자가 아니면 스택에 넣는다.
2. 연산자면 스택에서 필요한 피연산자 수만큼 pop하고 이를 계산한 뒤 결과를 스택에 넣는다.
3. 이를 반복한다.
package com.em.util;
import java.util.Stack;
/**
*
* @author
* 후에 Generic으로 변경 예정 즉, 정수형, 문자형에 대해 처리 예정.
* 문자는 따로 계산 정의토록(그러나 필요 없음)
*/
public class ReversePolishCalculatorDouble {
private Stack<String> stack;
private Double a, b;
private Double result;
public ReversePolishCalculatorDouble() {
stack = new Stack<>();
}
public double getResult(){
return result;
}
public void calculateReversePolishNotation(String expr, String token){
String[] tokens = expr.split(token);
for(String tokenString : tokens){
switch(tokenString){
case "+":
b = Double.parseDouble(stack.pop());
a = Double.parseDouble(stack.pop());
stack.push((a+b)+"");
break;
case "-":
b = Double.parseDouble(stack.pop());
a = Double.parseDouble(stack.pop());
stack.push((a-b)+"");
break;
case "*":
b = Double.parseDouble(stack.pop());
a = Double.parseDouble(stack.pop());
stack.push((a*b)+"");
break;
case "/":
b = Double.parseDouble(stack.pop());
a = Double.parseDouble(stack.pop());
stack.push((a/b)+"");
break;
default:
stack.push(tokenString);
break;
}
}
result = Double.parseDouble(stack.pop());
}
}
댓글 없음:
댓글 쓰기