错误提示
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6
at java.lang.String.charAt(String.java:686)
at com.javaAssignment.TestItoS.TrnsInToSufix(TestItoS.java:14)
at com.javaAssignment.TestItoS.main(TestItoS.java:102)
package com.javaAssignment;import java.util.Stack;public class TestItoS {
public static void TrnsInToSufix(String IFX,String []PFX)
{
StringBuffer numBuffer = new StringBuffer();// 用来保存一个数的
Stack<String> s=new Stack<String>();//放操作符
String a;
s.push("=");//第一个话等号
int i=0,j=0;
char ch;
while(IFX.charAt(i)!='=')
{
ch=IFX.charAt(i);
switch(ch)
{
case '0':case '1':case '2':
case '3':case '4':case '5':
case '6':case '7':case '8':
case '9':
while(Character.isDigit(ch)||ch=='.')//拼数
{
numBuffer.append(ch); // 追加字符
ch = IFX.charAt(++i);
}
PFX[j++]=numBuffer.toString();break;
    case '(':
s.push("(");break;
    case ')':
     while(s.peek()!="(")
     PFX[j++]=s.pop();
     break;
    case '+':
    case '-':
     while(s.size()>1&&s.peek()!="(")
     PFX[j++]=s.pop();
     a=String.valueOf(ch);
     s.push(a);break;
    case '*':
    case '/':
     while(s.size()>1&&(s.peek()=="*")||s.peek()=="/")
     PFX[j++]=s.pop();
     a=String.valueOf(ch);
     s.push(a);break;
}
i++;
}
while(s.size()>1)
PFX[j]=s.pop();
PFX[j]="=";
}
public static String Evaluate (String []PFX)
{
int i=0,j=0;
double x1,x2,n;
String str;
Stack<String> s= new Stack<String>();
while(PFX[i]!="=")
{
str=PFX[i];
switch(str.charAt(0))
{
case '0':case '1':case '2':
case '3':case '4':case '5':
case '6':case '7':case '8':
case '9':
s.push(str);break;
case '+':
x1=Double.parseDouble(s.pop());
x2=Double.parseDouble(s.pop());
n=x1+x2;
s.push(String.valueOf(n));break;
case '-':
x1=Double.parseDouble(s.pop());
x2=Double.parseDouble(s.pop());
n=x1-x2;
s.push(String.valueOf(n));break;
case '*':
x1=Double.parseDouble(s.pop());
x2=Double.parseDouble(s.pop());
n=x1*x2;
s.push(String.valueOf(n));break;
case '/':
x1=Double.parseDouble(s.pop());
x2=Double.parseDouble(s.pop());
n=x1+x2;
s.push(String.valueOf(n));break;
}
i++;
}
return s.pop();
} /**
 * @param args
 */
public static void main(String[] args) {
String s="1+2*3=";
String []PFX = new String[100];
TrnsInToSufix(s,PFX);
System.out.print(Evaluate (PFX)); }}

解决方案 »

  1.   

    在while (IFX.charAt(i) != '=') {}之前要判断IFX的length.
    剩下的你懂的...
      

  2.   

    IFX.charAt(i)或IFX.charAt(++i)时,注意i(++i)后,i<IFX.length
      

  3.   

    LZ太想当然了,就你的数据,一分析就出问了,而且错误提示也明确指出了
    就拿你的字符串"1+2*3="来说,当charAt(i)='3'的时候,进入case 数字的while(Character.isDigit(ch)||ch=='.'),执行ch = IFX.charAt(++i),注意,此时ch='=',i已经到了最后一个字符,然后while不满足退出while,然后退出switch case,此时接着进行i++,i已经越界,然后while(IFX.charAt(i)!='=')抛出越界错误。
    这么简单的问题,自己分析一下就清楚了
      

  4.   

        public static void TrnsInToSufix(String IFX,String []PFX)
        {
            StringBuffer numBuffer = new StringBuffer();// 用来保存一个数的
            Stack<String> s=new Stack<String>();//放操作符
            String a;
            s.push("=");//第一个话等号
            int i=0,j=0;
            char ch;
            for(i=0;i<IFX.length();i++)//这个我改成for,可以运行了,但是为什么我的         
                                              //操作符存不进我栈里?
            {
                ch=IFX.charAt(i);
                switch(ch)
                {
                case '0':case '1':case '2':
                case '3':case '4':case '5':
                case '6':case '7':case '8':
                case '9':
                    while(Character.isDigit(ch)||ch=='.')//拼数
                        {
                        numBuffer.append(ch); // 追加字符
                        ch = IFX.charAt(++i);
                        }
                    PFX[j++]=numBuffer.toString();break;
                case '(':
                    s.push("(");break;
                case ')':
                    while(s.peek()!="(")
                        PFX[j++]=s.pop();
                    break;
                case '+':
                case '-':
                    while(s.size()>1&&s.peek()!="(")
                        PFX[j++]=s.pop();
                    a=String.valueOf(ch);
                    s.push(a);break;
                case '*':
                case '/':
                    while(s.size()>1&&(s.peek()=="*")||s.peek()=="/")
                        PFX[j++]=s.pop();
                    a=String.valueOf(ch);
                    s.push(a);break;
                }
                
            }
            while(s.size()>1)
                PFX[j++]=s.pop();   //原为PFX[j],这个是之前打错了
            PFX[j]="=";
        }
      

  5.   

    LZ有没有想过,当你ch = IFX.charAt(++i);i就增加了,此时你的for再进行一次i++,表示i增加2次了,所以运算符全都被忽略了,还有,你的PFX[j++]=numBuffer.toString();后,numBudffer不清空,也就是说,后面的运算数字,都会把前面的运算数字也包含在里面,这明显不符合你的意图的public static void TrnsInToSufix(String IFX,String []PFX)
        {
            StringBuffer numBuffer = new StringBuffer();// 用来保存一个数的
            Stack<String> s=new Stack<String>();//放操作符
            String a;
            s.push("=");//第一个话等号
            int i=0,j=0;
            char ch;
            for(i=0;i<IFX.length();) //i++要自己控制
            {
                ch=IFX.charAt(i);
                switch(ch)
                {
                case '0':case '1':case '2':
                case '3':case '4':case '5':
                case '6':case '7':case '8':
                case '9':
                    while(Character.isDigit(ch)||ch=='.')//拼数
                        {
                        numBuffer.append(ch); // 追加字符
                        ch = IFX.charAt(++i);
                        }
                    PFX[j++]=numBuffer.toString();//break; 
                    numBuffer = new StringBuffer(); //清空已获取的运算数字
                      continue; //这里要重新循环,因为你的i已经增加过了
                case '(':
                    s.push("(");break;
                case ')':
                    while(s.peek()!="(")
                        PFX[j++]=s.pop();
                    break;
                case '+':
                case '-':
                    while(s.size()>1&&s.peek()!="(")
                        PFX[j++]=s.pop();
                    a=String.valueOf(ch);
                    s.push(a);break;
                case '*':
                case '/':
                    while(s.size()>1&&(s.peek()=="*")||s.peek()=="/")
                        PFX[j++]=s.pop();
                    a=String.valueOf(ch);
                    s.push(a);break;
                }
                i++; //这里要自己控制i,
                       //其实这跟之前你的while循环差不多,你把while改成IFX.length()
                    //或者你原来的while(IFX.charAt(i)!='='),在i++之前判断一下if(ch=='=') break;就可以了
            }
            while(s.size()>1)
                PFX[j++]=s.pop();   //原为PFX[j],这个是之前打错了
            PFX[j]="=";
        }