1

私はstruktogramでrpnを書きます。

最新の問題:現在、正しく機能していません。

入力文字列が「5+((1 + 2)* 4)-3」の場合

私の出力は次のとおりです:5 1 2 + 4 * 3-+

私はこの結果を得る必要があります:5 1 2 + 4 * +3-

ソースを編集しました

*それは元々の問題でしたが、私を助けてくれました。そして今では元々の間違いが修正されました:*

ループまたはinti= 12の場合のデバッグ では、c値は0 \ 0など であり、この値は出力(名前:数式)文字列に'('ブラケットとして追加されます。理由はわかりません。 そして最後の'-'演算記号は、出力文字列(式)の最後に追加されない(または表示されない) '('によってこの問題の原因を誤解しました。 他の文字列入力値でプログラムを試しましたが、常に'('を文字列に追加しますが、理由はわかりません...ブラケットの数に依存しないことがわかりました。常に1つだけ'('が文字列に追加されます... *)はい、英語LengyelFormula=rpn(ハンガリー語です)*

static void Main(string[] args)
    {
        String str = "5 + ( ( 1 + 2 ) *  4 ) −3";
        String result=LengyelFormaKonvertalas(str);
        Console.WriteLine(result.ToString());
        Console.ReadLine();
    }

    static String LengyelFormaKonvertalas(String input) // this is the rpn method
    {
       Stack stack = new Stack();
       String str = input.Replace(" ",string.Empty);
       StringBuilder formula = new StringBuilder();
       for (int i = 0; i < str.Length; i++)
       {
           char x=str[i];
           if (x == '(')
               stack.Push(x);
           else if (IsOperandus(x)) // is it operand
           {
               formula.Append(x);
           }
           else if (IsOperator(x))  // is it operation
           {
               if (stack.Count>0 && (char)stack.Peek()!='(' && Prior(x)<=Prior((char)stack.Peek()) )
               {
                   char y = (char)stack.Pop();
                   formula.Append(y);
               }
               if (stack.Count > 0 && (char)stack.Peek() != '(' && Prior(x) < Prior((char)stack.Peek()))
               {
                   char y = (char)stack.Pop();
                   formula.Append(y);
               }
               stack.Push(x);
           }
           else
           {
              char y=(char)stack.Pop();
              if (y!='(')
              {
                  formula.Append(y);
              }
           }
       }
       while (stack.Count>0)
       {
           char c = (char)stack.Pop();
           formula.Append(c);
       }
       return formula.ToString();
    }

    static bool IsOperator(char c)
    {
        return (c=='-'|| c=='+' || c=='*' || c=='/');
    }
    static bool IsOperandus(char c)
    {
        return (c>='0' && c<='9' || c=='.');
    }
    static int Prior(char c)
    {
        switch (c)
        {
            case '=':
                return 1;
            case '+':
                return 2;
            case '-':
                return 2;
            case '*':
                return 3;
            case '/':
                return 3;
            case '^':
                return 4;
            default:
                throw new ArgumentException("Rossz paraméter");                                          
        }
    }
}
4

3 に答える 3

3
using System;
using System.Collections.Generic;
using System.Text;

class Sample {
    static void Main(string[] args){
        String str = "5 + ( ( 1 + 2 ) *  4 ) -3";
        String result=LengyelFormaKonvertalas(str);
        Console.WriteLine(result);
        Console.ReadLine();
    }

    static String LengyelFormaKonvertalas(String input){
       Stack<char> stack = new Stack<char>();
       String str = input.Replace(" ", string.Empty);
       StringBuilder formula = new StringBuilder();
       for (int i = 0; i < str.Length; i++){
           char x=str[i];
           if (x == '(')
               stack.Push(x);
           else if (x == ')'){
               while(stack.Count>0 && stack.Peek() != '(')
                   formula.Append(stack.Pop());
               stack.Pop();
           } else if (IsOperandus(x)){
               formula.Append(x);
           } else if (IsOperator(x)) {
               while(stack.Count>0 && stack.Peek() != '(' && Prior(x)<=Prior(stack.Peek()) )
                   formula.Append(stack.Pop());
               stack.Push(x);
           }
           else {
              char y= stack.Pop();
              if (y!='(') 
                  formula.Append(y);
           }
       }
       while (stack.Count>0) {
           formula.Append(stack.Pop());
       }
       return formula.ToString();
    }

    static bool IsOperator(char c){
        return (c=='-'|| c=='+' || c=='*' || c=='/');
    }
    static bool IsOperandus(char c){
        return (c>='0' && c<='9' || c=='.');
    }
    static int Prior(char c){
        switch (c){
            case '=':
                return 1;
            case '+':
                return 2;
            case '-':
                return 2;
            case '*':
                return 3;
            case '/':
                return 3;
            case '^':
                return 4;
            default:
                throw new ArgumentException("Rossz parameter");                                          
        }
    }
}
于 2011-10-16T22:33:07.787 に答える
0

IsOperator では、c == '-' をチェックします。
しかし、文字列には −3 と書きます。
- は - と同じ文字ではあり
ません - 私はポーランド語のことを知らないので、何かが欠けているのかもしれませんが、それが「-」演算子が出力されない理由です。式に追加しないでください。

于 2011-10-16T16:18:02.960 に答える
0

を取得したら、)すべての演算子をポップして式に追加し、 に達するまで、(その '(' も同様にポップする必要があります。

演算子を取得したら、その優先度が の優先度以上である場合にのみ、スタックをポップしてこの演算子を式に追加する必要がありxます。最初のチェックですでにカバーされているため、2 番目のチェックは冗長です。

原則として、1+2+31+2-31*2+3などの単純な入力を使ってプログラムを試し1+2*3、正しい結果が得られるかどうかを確認してください。このように体系的にテストすることで、エラーをより早く見つけることができます。

于 2011-10-16T19:54:52.287 に答える