Обратная польская запись C # не работает правильно - PullRequest
1 голос
/ 16 октября 2011

Я пишу 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");                                          
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 17 октября 2011
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");                                          
        }
    }
}
0 голосов
/ 16 октября 2011

Когда вы получаете ), вы должны вытолкнуть всех операторов и добавить их в свою формулу, пока не достигнете (, и также добавьте этот '('.

Когда вы получаете оператор, вы должны только вытолкнуть стек и добавить этот оператор в формулу, если его приоритет больше или равен приоритету x. Ваша вторая проверка избыточна, поскольку она уже покрыта первой.

Как правило: попробуйте свою программу с помощью простых вводов, таких как 1+2+3, 1+2-3, 1*2+3 и 1+2*3, и посмотрите, получите ли вы правильный результат. Такое систематическое тестирование должно помочь вам быстрее находить ошибки.

0 голосов
/ 16 октября 2011

В IsOperator вы проверяете c == '-'.
Но в строке вы пишете -3.
- это не тот же символ, что и -
Я не знаю о польскомЧто-то, может быть, я что-то упускаю, но поэтому не выводится оператор «-», он не проходит проверку IsOperator и входит в предложение else, которое не добавляет его в формулу.

...