Я хотел бы создать алгоритм, основанный на двух стеках, но мой калькулятор плохо работает для оператора ')'.Он должен быть на выходе последнего из стека чисел, но ничего не происходит, когда я добавляю ')'.Любые предложения?
Мы обрабатываем дополнительные токены до конца выражения:
, если мы встречаем число, мы помещаем его обратно в стек значений
, если встречаемсяоператор, мы помещаем его в стек операторов
, если мы сталкиваемся с открывающей скобкой, мы ничего не делаем
, если мы сталкиваемся с закрывающей скобкой, тогда:
- вынимаем оператор и два значения из стека
- вычисляем значение выражения
- помещаем результат в стек значений
вычисляемзначение выражения находится в стеке
#include <iostream>
#include <string>
#include <sstream>
#include <stack>
#include <vector>
using namespace std;
int main()
{
string c;
stack<int>numbers;
stack<char>operators;
cin >> c;
string expression(c);
for(unsigned int i =0; i <expression.size(); i++)
{
if( expression[i] >= 48 && expression[i] <= 57 )
{
numbers.push(expression[i]);
}
else if(expression[i] == '(')
{
;
}
else if(expression[i] == '+')
{
operators.push(expression[i]);
}
else if(expression[i] == '-')
{
operators.push(expression[i]);
}
else if(expression[i] == '*')
{
operators.push(expression[i]);
}
else if(expression[i] == '/')
{
operators.push(expression[i]);
}
else if(expression[i] == ')' )
{
if(operators.top()== '+')
{
int a,b, score;
a = numbers.top() - '0';
numbers.pop();
b = numbers.top() - '0';
numbers.pop();
score = a+b;
numbers.push(score);
operators.pop();
}
else if(operators.top()== '-')
{
int a,b, score;
a = numbers.top() - '0';
numbers.pop();
b = numbers.top() - '0';
numbers.pop();
score = b-a;
numbers.push(score);
operators.pop();
}
else if(operators.top()== '*')
{
int a,b, score;
a = numbers.top()- '0';
numbers.pop();
b = numbers.top()- '0';
numbers.pop();
score = a*b;
numbers.push(score);
operators.pop();
}
else if(operators.top()== '/')
{
int a,b, score;
a = numbers.top()- '0';
numbers.pop();
b = numbers.top()- '0';
numbers.pop();
score = b/a;
numbers.push(score);
operators.pop();
}
}
}
cout << numbers.top()<<endl;
return 0;
}