Я пишу программу на C ++, которая читает одну строку ввода из stdin, интерпретирует ее как арифметическое c выражение (сложение и умножение), оценивает его и записывает результат.
Это может быть Предполагается, что целые числа помещаются в одно 32-разрядное целое число без знака, а результат также помещается в 32-разрядное целое число без знака, а входные данные не вызывают целочисленное переполнение. Мне посоветовали не использовать дерево разбора.
Также программа должна иметь возможность поддерживать скобки для группировки и обнаруживать целочисленное переполнение во время оценки. Я вставил приведенный ниже код.
Я ищу предложения по улучшению и дальнейшей оптимизации.
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
int calcSum();
int calcProd();
vector<int> num_vector;
vector<char> op_vector;
int op_count=0,num_count=0;
int main(){
string expr,operand;
getline(cin,expr);
for(size_t i=0;i<expr.size();i++){
bool insert =0;int number =0;
if(expr[i] >= '0' && expr[i] <= '9'){
operand += expr[i];
if(i==expr.size()-1) insert=1;
}
else if(((expr[i] == '+' || expr[i] == '*' || expr[i] == ' ') && (expr[i+1] >= '0' && expr[i+1] <= '9'))){
insert = 1;
}
if(expr[i] == '+' || expr[i]== '*') op_vector.push_back(expr[i]);
if(insert){
stringstream newop(operand);
newop >> number;
num_vector.push_back(number);
operand = "";
}
}
int result = calcSum();cout << result << endl;
return 0;
}
int calcSum(){
int val1 = calcProd();
while(op_vector[op_count] == '+'){
++op_count;
int val2 = calcProd();
val1 = val1 + val2;
}
return val1;
}
int calcProd(){
int val1 = num_vector[num_count];num_count++;
while(op_vector[op_count] == '*'){
++op_count;
int val2 = num_vector[num_count];num_count++;
val1 = val1 * val2;
}
return val1;
}