1

これまでの私のコードは次のとおりです。

public class PostfixCalculator {

   private Stack<Float> stack;
   private float result;

   private Boolean isOperator (char op){
    boolean operator;
    switch (op){
        case '+':
        case '-':
        case '*':
        case '/':
        case '^':
            operator = true;
            break;
    default:
        operator = false;
        break;}
    return operator;
}

private Boolean isFunction (String func){
    String[] functions = {"sin", "cos", "max"};
    for (int i=0; i<functions.length; i++){
        if (func.equals(functions[i]))
            return true; }
    return false;
}

private void computeOperator (float op1, float op2, char op){
    switch (op){
        case '+': 
            result = op1 + op2;
            break; 
        case '-': 
            result = op1 - op2;
            break;
        case '/': 
            result = op1/op2;
            break;
        case '*': 
            result = op1 * op2; 
            break;
        case '^': 
            result = (float) Math.pow(op1, op2);
            break;

        default:
            break;
    }   
}

public float calculate(String expr) throws IllegalArgumentException {
    result = 0;
    String token;
    Float makeit;
    char operator;
    float op1, op2, pushFloat;
    StringTokenizer calc=new StringTokenizer(expr);

    stack = new Stack<Float>();

    while (calc.hasNextToken()){
        token=calc.getNextToken();
        operator=token.charAt(0);

        if (!(this.isOperator(operator))){
            if (this.isFunction(token)){
                if (token.equals("sin")){
                    op1=stack.pop();
                    result = (float) Math.sin(op1);
                    stack.push(result);
                }
                else if (token.equals("cos")){
                    op1=stack.pop();
                    result = (float) Math.cos(op1);
                    stack.push(result);
                }
                else if (token.equals("max")){
                    op1=stack.pop();
                    op2=stack.pop();
                    result=Math.max(op1, op2);
                    stack.push(result);
                }

            }
            else {
                makeit = new Float(token);
                pushFloat = makeit.floatValue();
                stack.push(pushFloat);
            }

        }
        else {
            op1 = stack.pop();
            op2 = stack.pop();
            computeOperator (op1, op2, operator);
            stack.push(result);


        }
    }
    return stack.pop();
}

}

基本はわかっていると思いますが、たとえば「2 3 4 *-」のように、3桁以上続けて後置計算を処理するにはどうすればよいですか?どんな助けでもいただければ幸いです。前もって感謝します!

4

2 に答える 2

1

このような計算機の場合、スタックを使用する必要があります。すべての数字はプッシュであり、すべての操作には対応するアクションがあります。

st = []
while input:
  if isanumber(input.next()): st.push(input.consume())
  else: #its an operator
    #note this may be wrong for operators that have a specific order
    if(input.next() == "+"): 
      stack.push(stack.pop() + stack.pop())
    # more operations
    input.consume()
print(st)

そして、それはそれを行うための大まかなPythonになります。この場合、私は決定を下す前に1つのトークンを先読みします。

編集:

おそらく投稿する前にコードを読んでおく必要がありますが、とにかく計算された数値を常にプッシュバックする必要があります。また、コードを「関数」と「数値」のみに単純化して、両方を実行する関数を作成する必要があります。正規表現は、 http: //www.cplusplus.com/reference/std/regex/などのこの種のものにも役立ちます。

于 2012-10-16T02:41:07.257 に答える
1

うん、スタック。また、配列とカウンターを使用して簡単なスタックを簡単に実装できます。派手なクラスを使用する必要はありません。

配列は、処理できる最も深くネストされた式と同じ大きさになります(事実上すべての「実際の」問題には、10個の要素で十分です)。

プッシュはA[i]を更新し、iをインクリメントします。ポップはデクリメントiであり、参照A[i]です。「89+」はpush(8)、push(9)で、上位2つの要素をポップし、それらを追加して、結果をプッシュします。演算子はプッシュされず、オペランド/結果のみがプッシュされることに注意してください。

'2 3 4 *-'は、push(2)、push(3)、push(4)、pop top two、multiply、push result、pop two、subtract、pushresultになります。

「76+ cos」は、push(7)、push(6)、pop two、add、push result、pop one、perform "cos"、pushresultになります。

要素をポップする必要があり、カウンターがゼロの場合はエラーになります(たとえば、「7 +」-2回ポップしたいが、1回しかポップできない)。また、ユーザーが「終了」と表現し、スタックに複数の要素がある場合のエラー。

プッシュされた最後の値または結果であるため、常に最上位の要素を「表示」します。

于 2012-10-16T02:57:26.970 に答える