Калькулятор со скобками (обратная польская запись) - C#
Формулировка задачи:
взял реализацию...сделанную по принципу ОПН ..нашел баг в проге..нещитает числа с запятыми начал переделывать и вот ошибка --
op2 = double.Parse(numbersStack.Pop);
op1 = double.Parse(numbersStack.Pop); - Ошибка 2 Аргумент "1": преобразование типа из "группа методов" в "string" невозможно.
В чем дело?
Листинг программы
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- public static string ToRPN(string initialString)
- {
- // В стеке будут содержаться операции из выражения
- Stack<char> opervsteke = new Stack<char>();
- //последняя операция
- char lastOperation;
- // Результирующая строка
- string result = string.Empty;
- // Удаляем из входной строки лишние пробелы
- initialString = initialString.Replace(" ", "");
- for (int i = 0; i < initialString.Length; i++)
- {
- // Если текущий символ - число, добавляем его к результирующей строке
- if (Char.IsDigit(initialString[i]) || initialString[i] == ',' || initialString[i] == '.' || initialString[i] == '-')
- {
- result += initialString[i];
- continue;
- }
- if (IsOperation(initialString[i]))
- {
- // Если это не первая операция в выражении,
- // то нам необходимо будет сравнить ее
- // с последней операцией, хранящейся в стеке.
- // Для этого сохраняем ее в переменной lastOperation
- //
- if (opervsteke.Count != 0)
- lastOperation = opervsteke.Peek();
- // Иначе (если это первая операция), кладем ее в стек,
- // и переходим к следующему символу
- else
- {
- opervsteke.Push(initialString[i]);
- continue;
- }
- // Если приоритет текущей операции больше приоритета
- // последней, хранящейся в стеке, то кладем ее в стек
- //
- if (GetOperationPriority(lastOperation) < GetOperationPriority(initialString[i]))
- {
- opervsteke.Push(initialString[i]);
- continue;
- }
- // иначе, выталкиваем последнюю операцию,
- // а текущую сохраняем в стек
- else
- {
- result += opervsteke.Pop();
- opervsteke.Push(initialString[i]);
- continue;
- }
- }
- // Если текущий символ - '(', кладем его в стек
- if (initialString[i].Equals('('))
- {
- opervsteke.Push(initialString[i]);
- continue;
- }
- if (initialString[i].Equals(')'))
- {
- while (opervsteke.Peek() != '(')
- {
- result += opervsteke.Pop();
- }
- opervsteke.Pop();
- }
- }
- while (!(opervsteke.Count == 0))
- {
- result += opervsteke.Pop();
- }
- // Возвращаем результат
- return result;
- }
- >
- public static double CalculateRPN(string rpnString)
- {
- Stack<double> numbersStack1 = new Stack<double>();
- Stack<char> numbersStack = new Stack<char>();
- double op1, op2;
- for (int i = 0; i < rpnString.Length; i++)
- {
- // Если символ - цифра, помещаем его в стек,
- if (Char.IsDigit(rpnString[i])|| rpnString[i]== ',' || rpnString[i] == '.' || rpnString[i] == '-')
- numbersStack.Push((rpnString[i]));
- // иначе (символ - операция), выполняем эту операцию
- // для двух последних значений, хранящихся в стеке.
- // Результат помещаем в стек
- else
- {
- op2 = double.Parse(numbersStack.Pop);
- op1 = double.Parse(numbersStack.Pop);
- numbersStack1.Push(ApplyOperation(rpnString[i], op1, op2));
- }
- }
- return (numbersStack1.Pop());
- }
Решение задачи: «Калькулятор со скобками (обратная польская запись)»
textual
Листинг программы
- op2 = double.Parse(numbersStack.Pop());
- op1 = double.Parse(numbersStack.Pop());
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д