자바 후위계산식 질문
조회수 423회
package StackCalculator; import java.util.*;
class Converters {
String expr;
String result="";
ArrayList<String> sort = new ArrayList<String>();
ArrayList<String> pfA = new ArrayList<String>(); //postfix ArrayList
Stack ops = new Stack();
//exprConvert
public String converter(String expr){
//변환할 수식을 잘라서 배열에 넣는다
StringTokenizer st= new StringTokenizer(expr,"+-*/", true);
while(st.hasMoreTokens()) {
String str=st.nextToken();
str=str.trim();
sort.add(str);
}
String[] before= new String[sort.size()];
before= (String[])sort.toArray(before);
//반복문 start
for(int i = 0; i<before.length; i++){
//값이 숫자일 경우 리스트에 추가
if(stLevel(before[i])==-1){
pfA.add(before[i]);
}
//연산자일 경우
//스택 최상위 연산자보다 먼저 연산해야 하는 연산자일 경우, 스택에 그대로 추가
else if(isPushToStack(stLevel(before[i]))){
ops.push(before[i]);
}
//스택 최상위 연산자보다 늦게 연산해야 하는 연산자 경우, 최상위 스택의 연산자를 리스트에 추가하고 그자리에 현재 연산자를 추가
else{
pfA.add(ops.pop().toString());
ops.push(before[i]);
}
}
// " "를 제외한스택에 남아있는 모든 연산자를 리스트에 추가
while(!ops.isEmpty()){
if(!ops.peek().equals(" ")) {
pfA.add(ops.pop().toString());
}
else
ops.pop();
}
//리스트의 값들을 꺼내어 리턴값 생성
for(int j = 0; j<pfA.size(); j++){
result += pfA.get(j);
}
return result;
}
private String[] add(String str) {
return null;
}
//연산자의 레벨. 먼저 계산해야 하는 연산자일수록 높은 레벨. 숫자는 -1.
public int stLevel(String st){
switch (st){
case"*":case"/":return 5;
case"+":case"-":return 3;
default: return -1;
}
}
//레벨이 높으면 스택상위로 추가
public boolean isPushToStack(int level){
if(ops.isEmpty()){
return true;
}
if(stLevel(ops.peek().toString())<=level){
return true;
}
return false;
}
}
package StackCalculator;
import java.util.ArrayList; import java.util.Stack;
public class Calculator {
public double calculator(String expr) {
String[] st = expr.split("");
Stack sa = new Stack();
double result = 0;
double temp1 = 0;
double temp2 = 0;
for (int i = 0; i < st.length; i++) {
switch (st[i]) {
case "+":
temp1 = Double.parseDouble(sa.pop().toString());
temp2 = Double.parseDouble(sa.pop().toString());
result = temp2 + temp1;
sa.push(result);
break;
case "-":
temp1 =Double.parseDouble(sa.pop().toString());
temp2 =Double.parseDouble(sa.pop().toString());
result = temp2 - temp1;
sa.push(result);
break;
case "*":
temp1 =Double.parseDouble(sa.pop().toString());
temp2 = Double.parseDouble(sa.pop().toString());
result = temp2 * temp1;
sa.push(result);
break;
case "/":
temp1 = Double.parseDouble(sa.pop().toString());;
temp2 = Double.parseDouble(sa.pop().toString());
result = temp2 / temp1;
sa.push(result);
break;
default:
sa.push(st[i]);
}
}
return result;
}
}
package StackCalculator;
import java.util.*;
public class Tester {
public static void main(String[] args) {
Converters con = new Converters();
Calculator ca = new Calculator();
Scanner sc= new Scanner(System.in);
System.out.print("타겟 :");
String expr=sc.nextLine();
System.out.println("결과 : "+ con.converter(expr));
System.out.println("계산결과: "+ca.calculator(con.converter(expr)));
}
}
<질문>
중위계산표기를 후위계산표기로 바꾸는건 했지만 후위계산식을 실행하니까 계산결과가 안나와요ㅜㅜ 도와주세요!!
타겟 :2+4*5
결과 : 245*+
계산결과: 34.0
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력