需要在执行Java算法Postfix评估方面的帮助
我已经尝试从头开始编写此代码,编码并运行它,但它似乎并不奏效。这在课堂上被指定为实验室工作。要求如下: 使用堆栈和堆栈操作(用户定义)实现后缀评估。 我认为我的程序算法是正确的,但它总是给我一个错误的答案。 这是我的代码。需要在执行Java算法Postfix评估方面的帮助
public class StackApplication {
public static class Stack<T> {
private int top = 0;
private final static int stackMax=100;
// highest index of stk array
private Object[] stk = new Object[stackMax+1];
//Elements must be cast back.
public Stack() { // constructor
}
public boolean isEmpty(){
if (top==0) return true;
else return false;
}
public void push(T el) {
if(top==stackMax)
System.out.println("Stack push overflow error");
else top=top+1;
stk[top]=el;
}
public T pop(){
if(isEmpty()){
System.out.println("Stack push underflow error");
return null;
}
else top=top-1;
return(T)stk[top+1];
}
public T top(){
if(isEmpty()){
//System.out.println("Stack empty");
return null;
}
else return (T)stk[top];
}
}
public static boolean isOperator(char c){
return(c=='+' || c=='-' || c=='/' || c=='*' || c=='^');
}
public static double evaluate(double x, char o, double y) {
double result=0;
switch(o) {
case '+' : result=x+y; break;
case '-' : result=x-y; break;
case '*' : result=x*y; break;
case '/' : result=x/y; break;
case '^' : result=Math.pow(x, y); break;
default : break;
}
return result;
}
public static void main(String[] args) {
Scanner console=new Scanner(System.in);
Stack<Double> s=new Stack<Double>();
System.out.println("Input Postfix form to evaluate:");
String inp=console.nextLine();
char[] chararray=inp.toCharArray();
double b,a;
for(int i=0; i<chararray.length; i++) {
if(!isOperator(chararray[i]))
s.push((double)chararray[i]);
else {
b=s.pop();
a=s.pop();
double c=evaluate(a, chararray[i], b);
s.push(c);
}
}
System.out.println(" " +s.pop());
}
}
样本输出: 输入后缀形式来评价:
23+ (Input)
101.0 (Output)
5.0 (Expected output)
的问题是在这里:s.push((double)chararray[i]);
。您无法通过这种方式将char
转换为double
。您现在正在使用2
和3
的ascii代码。
50(ascii code of 2) + 51(ascii code of 3) = 101
做这样的:s.push((double)(chararray[i] - '0'));
谢谢。我现在意识到,铸造加倍对于这些行动毫无意义。不幸的是,转换为任何数据类型都不等于解析。谢谢您的帮助。 – user919789
@ user919789 - 不客气:) –
你在做加法的ASCII码为2和3,而不是2和3
2的代码是50,因为3是51,所以你的出局是101,在这种情况下是正确的。
当您按下时,按chararray[i]-'0'
。这将解决您的问题。
对于这种问题,我认为你最好调试问题。如下面的评论所示,如果您曾尝试进入课程执行阶段,您将很容易找到此根本原因 – Ivan