#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<stack>
using namespace std;
double read_and_evaluate(istream& ins);
void evaluate_stack_tops(stack<double>& numbers,stack<char>& operations);
int main()
{
double answer;
cout<<"Type a fully parenthesized arithmetic expression:"<<endl;
answer= read_and_evaluate(cin);
cout<<"That evaluates to"<<answer<<endl;
return EXIT_SUCCESS;
}
double read_and_evaluate(istream& ins)
{
const char DECIMAL = '.';
const char RIGHT_PARENTHESIS = ')';
stack<double> numbers;
stack<char> operations;
double number;
char symbol;
while(ins&&ins.peek() != '\n')
{
if(isdigit(ins.peek())||(ins.peek()==DECIMAL))
{
ins>>number;
numbers.push(number);
}
else if(strchr("+-*/",ins.peek())!=NULL)
{
ins>>symbol;
operations.push(number);
}
else if(ins.peek()==RIGHT_PARENTHESIS)
{
ins.ignore();
evaluate_stack_tops(numbers,operations);
}
else
ins.ignore();
}
return numbers.top();
}
void evaluate_stack_tops(stack<double>& numbers, stack<char>& operations)
{
double operand1,operand2;
operand2=numbers.top();
numbers.pop();
operand1=numbers.top();
numbers.pop();
switch(operations.top())
{
case '+': numbers.push(operand1+operand2);
break;
case '-': numbers.push(operand1-operand2);
break;
case '*': numbers.push(operand1*operand2);
break;
case '/': numbers.push(operand1/operand2);
break;
}
operations.pop();
}
I2luY2x1ZGU8Y2N0eXBlPgojaW5jbHVkZTxjc3RkbGliPgojaW5jbHVkZTxjc3RyaW5nPgojaW5jbHVkZTxpb3N0cmVhbT4KI2luY2x1ZGU8c3RhY2s+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmRvdWJsZSByZWFkX2FuZF9ldmFsdWF0ZShpc3RyZWFtJiBpbnMpOwp2b2lkIGV2YWx1YXRlX3N0YWNrX3RvcHMoc3RhY2s8ZG91YmxlPiYgbnVtYmVycyxzdGFjazxjaGFyPiYgb3BlcmF0aW9ucyk7CmludCBtYWluKCkKewpkb3VibGUgYW5zd2VyOwpjb3V0PDwiVHlwZSBhIGZ1bGx5IHBhcmVudGhlc2l6ZWQgYXJpdGhtZXRpYyBleHByZXNzaW9uOiI8PGVuZGw7CmFuc3dlcj0gcmVhZF9hbmRfZXZhbHVhdGUoY2luKTsKY291dDw8IlRoYXQgZXZhbHVhdGVzIHRvIjw8YW5zd2VyPDxlbmRsOwpyZXR1cm4gRVhJVF9TVUNDRVNTOwp9CmRvdWJsZSByZWFkX2FuZF9ldmFsdWF0ZShpc3RyZWFtJiBpbnMpCnsKY29uc3QgY2hhciBERUNJTUFMID0gJy4nOwpjb25zdCBjaGFyIFJJR0hUX1BBUkVOVEhFU0lTID0gJyknOwpzdGFjazxkb3VibGU+IG51bWJlcnM7CnN0YWNrPGNoYXI+IG9wZXJhdGlvbnM7CmRvdWJsZSBudW1iZXI7CmNoYXIgc3ltYm9sOwp3aGlsZShpbnMmJmlucy5wZWVrKCkgIT0gJ1xuJykKewppZihpc2RpZ2l0KGlucy5wZWVrKCkpfHwoaW5zLnBlZWsoKT09REVDSU1BTCkpCnsKaW5zPj5udW1iZXI7Cm51bWJlcnMucHVzaChudW1iZXIpOwp9CmVsc2UgaWYoc3RyY2hyKCIrLSovIixpbnMucGVlaygpKSE9TlVMTCkKewppbnM+PnN5bWJvbDsKb3BlcmF0aW9ucy5wdXNoKG51bWJlcik7Cn0KZWxzZSBpZihpbnMucGVlaygpPT1SSUdIVF9QQVJFTlRIRVNJUykKewppbnMuaWdub3JlKCk7CmV2YWx1YXRlX3N0YWNrX3RvcHMobnVtYmVycyxvcGVyYXRpb25zKTsKfQplbHNlCglpbnMuaWdub3JlKCk7Cn0KcmV0dXJuIG51bWJlcnMudG9wKCk7Cn0Kdm9pZCBldmFsdWF0ZV9zdGFja190b3BzKHN0YWNrPGRvdWJsZT4mIG51bWJlcnMsIHN0YWNrPGNoYXI+JiBvcGVyYXRpb25zKQp7CmRvdWJsZSBvcGVyYW5kMSxvcGVyYW5kMjsKb3BlcmFuZDI9bnVtYmVycy50b3AoKTsKbnVtYmVycy5wb3AoKTsKb3BlcmFuZDE9bnVtYmVycy50b3AoKTsKbnVtYmVycy5wb3AoKTsKc3dpdGNoKG9wZXJhdGlvbnMudG9wKCkpCnsKY2FzZSAnKyc6IG51bWJlcnMucHVzaChvcGVyYW5kMStvcGVyYW5kMik7CgkgICAgICBicmVhazsKY2FzZSAnLSc6IG51bWJlcnMucHVzaChvcGVyYW5kMS1vcGVyYW5kMik7CgkgICAgICBicmVhazsKY2FzZSAnKic6IG51bWJlcnMucHVzaChvcGVyYW5kMSpvcGVyYW5kMik7CgkgICAgICBicmVhazsKY2FzZSAnLyc6IG51bWJlcnMucHVzaChvcGVyYW5kMS9vcGVyYW5kMik7CgkgICAgICBicmVhazsKfQpvcGVyYXRpb25zLnBvcCgpOwp9