2

このコードを最初から書き、コーディングして実行しようとしましたが、うまくいかないようです。これは、クラスのラボワークとして割り当てられました。要件は次のとおりです。 スタックおよびスタック操作 (ユーザー定義) を使用して後置評価を実装する。私のプログラムのアルゴリズムは正しいと思いますが、いつも間違った答えを返します。これが私のコードです。

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());
    }
}

サンプル出力: 評価する入力 Postfix フォーム:

23+ (Input)
101.0  (Output)
5.0 (Expected output) 
4

2 に答える 2

1

問題はここにあります:s.push((double)chararray[i]);charこの方法に変換することはできませんdouble2現在、とのASCIIコードを使用してい3ます。

50(ascii code of 2) + 51(ascii code of 3) = 101

このようにしてください:s.push((double)(chararray[i] - '0'));

于 2011-08-30T13:52:31.347 に答える
1

2 と 3 ではなく、2 と 3 の ASCII コードの追加を行っています。

2 のコードは 50 で 3 のコードは 51 なので、out は 101 で、この場合は正しいです。

押すときは を押しchararray[i]-'0'ます。これで問題は解決します。

于 2011-08-30T13:56:20.913 に答える