1

我写了一个带有结构图的rpn。

最新问题:它现在不能正常工作。

如果输入字符串是“5 + ((1 + 2) * 4) - 3”

我的输出是:5 1 2 + 4 * 3 - +

我必须得到这个结果: 5 1 2 + 4 * + 3 -

编辑了源

*那是原来的问题,但对我有帮助,现在修复了原来的错误: * ,

在循环或 int i = 12 的调试中,c 值为 0\0 或其他 值,并且该值作为 '(' 括号添加到输出(名称:公式)字符串。我不知道为什么。 最后一个'-'操作符号,不要添加到(或不看)输出字符串(公式)的末尾我错误地由 '(' 引起了这个问题。 我尝试了其他字符串输入值的程序,但是总是在我的字符串中添加一个“(”,我不知道为什么......我看到它与括号的数量无关。总是只有一个“(”添加到我的字符串...... *)是的,在英语 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。
- 与 - 不是同一个字符 -
我不了解波兰语的东西,所以也许我遗漏了一些东西,但这就是为什么没有打印“-”运算符,它未通过 IsOperator 检查并进入 else 子句,这不会不要将其添加到公式中。

于 2011-10-16T16:18:02.960 回答
0

当你得到 a)时,你应该弹出所有运算符并将它们添加到你的公式中,直到你达到 a (,并弹出那个 '(' 。

当你得到一个运算符时,你应该只在它的优先级大于或等于 的情况下弹出堆栈并将这个运算符添加到公式中x。您的第二次检查是多余的,因为它已经被第一次覆盖。

作为一般规则:尝试使用一些简单的输入(如1+2+3、和)您的程序1+2-3,并查看是否得到正确的结果。像这样系统地测试应该可以帮助您更快地发现错误。1*2+31+2*3

于 2011-10-16T19:54:52.287 回答