以下は、infix形式の式Stringを受け取り、それを後置式に変換するJavaコードです。if-elseループでjava.util.EmptyStackExceptionが発生しています。スタックの実装はどこが間違っていますか?
package post;
import java.util.Stack;
public class InfixtoPostfix
{
void convert(String expression)
{
Stack<Character> st=new Stack<Character>();
char c;char p;char e;
int pr;int f;
int flag1=0;
String result=new String();
int i=0;
int len=expression.length();
while(len>0)
{
if(expression.charAt(i)!='+'&&expression.charAt(i)!='-'&&expression.charAt(i)!='*'&&expression.charAt(i)!='/')
{
result=result+(String.valueOf(expression.charAt(i)));
}
else if(expression.charAt(i)=='(')
{
st.push(expression.charAt(i));
}
else if(expression.charAt(i)==')')
{
c=st.pop();
while((st.size()>0) || (c!='('))
{
result=result+c;
c=st.pop();
}
}
else if(expression.charAt(i)=='+'||expression.charAt(i)=='-'||expression.charAt(i)=='*'||expression.charAt(i)=='/')
{
c=expression.charAt(i);
p=st.pop();
pr=precedence(c,p);
if(pr==0)
{
result=result+p;
st.push(c);
}
else
{
st.push(p);
st.push(c);
}
}
len--;i++;
}
System.out.println(result);
}
int precedence(char op1,char op2)
{
int b=0;
if((op1=='+'||op1=='-')&&(op2=='*'||op2=='/'))
{
b=0;
}
else if(op1=='*' && op2=='/')
{
b=0;
}
else if(op1=='/' && op2=='*')
{
b=1;
}
else if(op1=='+' && op2=='-')
{
b=1;
}
else if(op1=='+' && op2=='-')
{
b=1;
}
return b;
}
public static void main(String[] args)
{
InfixtoPostfix object=new InfixtoPostfix();
object.convert("4+3*7-5");
}
}
コメントの際にコード全体のコードセクションに続いて、エラーは発生しません。この特定のコードセクションがコメントされていない場合、java.util.EmptyStackExceptionエラーが発生します。
このコードセクションでは、スタック実装で何が起こっていますか?
else if(expression.charAt(i)=='+'||expression.charAt(i)=='- '||expression.charAt(i)=='*'||expression.charAt(i)=='/')
{
c=expression.charAt(i);
p=st.pop();
pr=precedence(c,p);
if(pr==0)
{
result=result+p;
st.push(c);
}
else
{
st.push(p);
st.push(c);
}
}
ソリューションは単純である、(ポップません)あなたは、いくつかの項目、すなわち(サイズをご確認残っている知っている限り)あなたがポップする前に。 –