错误提示
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)); }}
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+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)!='=')抛出越界错误。
这么简单的问题,自己分析一下就清楚了
{
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]="=";
}
{
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]="=";
}