私は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");
}
}
}