자바 스택이용해서 휘위표기법으로 바꾸기 질문좀합니다
자바 배운지 얼마 안돼서 많이 부족하고 코드가 난잡할 수 있습니다ㅠㅠ
최선을 다해 짜봤는데 오류가 뜨네용..
어느 부분에서 오류가 있을까요....
package test;
import java.util.Stack;
import java.util.ArrayList;
class Converter{
public String result = "";
String now = "";
String s="";
ArrayList<String> con_input = new ArrayList<String>(); //가변 크기의 배열->용량 절약
public int isNum(String str){ //숫자혹은.인지 연산자인지 알려주는 메소드
char ch=str.charAt(0); //0번째 문자를 가져오기
if((ch>='0' && ch<='9') || ch == '.') //숫자이거나 .이면
return 1;
else if(ch=='%') //%이면
return -1;
else return 0; //연산자이면(괄호, +-*/)
}
public int operator(String str) { //연산자 가중치 알려주는 메소드
switch(str) {
case "+" : case "-" : return 1;
case "*" : case "/" : return 2;
default : return 0;
}
}
//string으로 받은 후 퍼센트 연산 해주면서 arraylist로 바꿀 것..->연산자 만날 때 마다 끊기
public String converter(String input) { //후위식으로 변환해주는 메소드
StringBuilder sb = new StringBuilder(input); //%위해
Stack<String> st = new Stack<String>();
int start = 0;
for(int i = 0; i<sb.length(); i++) { //arraylist로 바꾸면서 %도 없애줌
if(isNum(now)==-1) //%이면
{
sb.delete(i,i+1); //%삭제
sb.insert(i,"*0.01"); //%자리에 *0.01 삽입 ->길이도 늘어나겠지?
i--;
}
if(isNum(now)==0) //+-*/괄호 이면 그전까지 자르기
{
if(isNum(sb.substring(i-1,i))==0) //그 전이 연산자나 괄호인 경우
con_input.add(sb.substring(i,i+1)); //연산자나 괄호 추출
else
{
con_input.add(sb.substring(start, i)); //연산자 전까지의 숫자 추출
con_input.add(sb.substring(i,i+1)); //연산자나 괄호 추출
start = i+1;
}
}
/*후위식으로 바꾸기*/
for(int j = 0; j<con_input.size(); j++)
{
now = con_input.get(j); //하나 추출해서 now에 넣기
if(now.contentEquals("+") || now.contentEquals("-") || now.contentEquals("*") || now.contentEquals("/") ||
now.contentEquals("(") || now.contentEquals(")"))
{ //연산자이면
switch(now) {
case ("("):
st.push(now);
break; //(를 만나면 바로 스택에 넣기
case (")"):
while(true) {
s= st.pop();
if(!(s.contentEquals("(")))
{
result = result.concat(s);
}
else
{
st.push(s);
break;
}
//()사이 연산자들 모조리 스택에서 빼서 추가
}
s = st.peek();
if(s.contentEquals("("))
st.pop();
break;
case ("+"): case("-"): case("*"): case("/"):
if(st.empty()) { //스택이 비었으면 무조건 스택에 넣기
st.push(now);
}
else { //스택이 비지 않았으면 연산자 가중치 비교
if(operator(st.peek()) >= operator(now)) //스택 내 윗것의 우선순위가 같거나 높으면
{result = result.concat(st.pop());
st.push(now);
}
else st.push(now); //스택 내 윗것의 우선순위가 작으면 now을 그냥 스택에 쌓아줌
}
break;
default: break;
}
}
else //숫자(double)이면
result = result.concat(now); //숫자이거나 .이면 바로 result에 넣기
}
while(!(st.empty())){
result = result.concat(st.pop());
}
return result;
}
} //바뀐 식 반환
public class Test{
public static void main(String[] args) {
Converter con = new Converter();
System.out.println("3*(4+50%)");
System.out.println(con.converter("3*(4+50%)"));
}
}
if(isNum(now)==-1) //%이면
위 행에서 현재 now가 "" 빈문자열 이기 때문에 charAt(0)을 실행하는 경우 배열 범위를 벗어났다는 에러가 뜨네요.
맨처음 now값을 할당해 주고 시작하셔야 할 것으로 보입니다.