Калькулятор со скобками (обратная польская запись) - 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());