#include <iostream>
#include <stack>
#include <vector>
#include <cstdlib>
using namespace std;
enum Operator {ERROR, NUM, PLUS, MINUS, DIV, MULTIPLY, SHOW, lBracket, rBracket};
struct Element
{
double operand;
Operator _operator;
};
Operator charToOperator(char ch)
{
switch (ch)
{
case '+':
return PLUS;
case '-':
return MINUS;
case '*':
return MULTIPLY;
case '/':
return DIV;
case '=':
return SHOW;
case '(':
return lBracket;
case ')':
return rBracket;
default:
return ERROR;
}
}
bool solve(vector <Element> elements, double &result)
{
stack <double> nums;
double rhs, lhs, temp;
for (unsigned int i = 0; i < elements.size(); i++)
{
if (elements[i]._operator == NUM)
nums.push(elements[i].operand);
else if (elements[i]._operator != SHOW)
{
if (nums.size() < 2)
return false;
rhs = nums.top();
nums.pop();
lhs = nums.top();
nums.pop();
switch (elements[i]._operator)
{
case PLUS:
temp = lhs + rhs;
break;
case MINUS:
temp = lhs - rhs;
break;
case MULTIPLY:
temp = lhs * rhs;
break;
case DIV:
if (rhs == 0)
{
cout << "错误:除数不能为0!" << endl;
return false;
}
temp = lhs / rhs;
break;
}
nums.push(temp);
}
else
{
if (nums.empty())
cout << "当前栈是空的!" << endl;
else
cout << "当前栈顶元素:" << nums.top() << endl;
}
}
if (nums.size() != 1)
return false;
result = nums.top();
return true;
}
void addAll(vector <Element> &elements, stack <Operator> &operators)
{
Element element;
while (!operators.empty() && (element._operator = operators.top()) != lBracket)
{
operators.pop();
elements.push_back(element);
}
}
bool infix(char *expression, double &result)
{
char *p = expression;
char digits[10];
char *p2 = digits, temp;
vector <Element> elements;
stack <Operator> operators;
Element element;
Operator op;
while (*p)
{
if (('0' <= *p && *p <= '9') || *p == '.')
{
*p2++ = *p;
}
else
{
if (p2 != digits)
{
*p2 = '\0';
element._operator = NUM;
element.operand = atof(digits);
elements.push_back(element);
p2 = digits;
}
switch (op = charToOperator(*p))
{
case PLUS:
case MINUS:
addAll(elements, operators);
operators.push(op);
break;
case MULTIPLY:
case DIV:
if (!operators.empty() && (operators.top() == MULTIPLY ||
operators.top() == DIV) && operators.top() != lBracket)
{
element._operator = operators.top();
operators.pop();
elements.push_back(element);
}
operators.push(op);
break;
case lBracket:
operators.push(lBracket);
break;
case rBracket:
addAll(elements, operators);
if (operators.empty() || operators.top() != lBracket)
return false;
else
{
operators.pop();
}
break;
case ERROR:
return false;
}
}
p++;
}
if (p2 != digits)
{
*p2 = '\0';
element._operator = NUM;
element.operand = atof(digits);
elements.push_back(element);
p2 = digits;
}
addAll(elements, operators);
cout << "后缀表达式:";
for (unsigned int i = 0; i < elements.size(); i++)
{
switch (elements[i]._operator)
{
case NUM:
cout << elements[i].operand << " ";
break;
case PLUS:
cout << "+ ";
break;
case MINUS:
cout << "- ";
break;
case MULTIPLY:
cout << "* ";
break;
case DIV:
cout << "/ ";
break;
case SHOW:
cout << "= ";
break;
}
}
cout << endl;
return solve(elements, result);
}
bool suffix_q(char *expression, double &result)
{
char *p = expression;
char digits[10];
char *p2 = digits;
vector <Element> elements;
Element element;
while (*p)
{
if ((*p >= '0' && *p <= '9') || *p == '.')
{
*p2++ = *p;
}
else
{
if (p2 != digits)
{
*p2 = '\0';
element._operator = NUM;
element.operand = atof(digits);
elements.push_back(element);
p2 = digits;
}
switch (*p)
{
case '+':
element._operator = PLUS;
elements.push_back(element);
break;
case '-':
element._operator = MINUS;
elements.push_back(element);
break;
case '*':
element._operator = MULTIPLY;
elements.push_back(element);
break;
case '/':
element._operator = DIV;
elements.push_back(element);
break;
case '=':
element._operator = SHOW;
elements.push_back(element);
break;
case '?':
break;
default:
return false;
}
}
p++;
}
return solve(elements, result);
}
bool suffix_space(char *expression, double &result)
{
char *p = expression;
char digits[10];
char *p2 = digits;
vector <Element> elements;
Element element;
while (*p)
{
if (('0' <= *p && *p <= '9') || *p == '.')
{
*p2++ = *p;
}
else if (*p == ' ')
{
if (p2 != digits)
{
*p2 = '\0';
element._operator = NUM;
element.operand = atof(digits);
elements.push_back(element);
p2 = digits;
}
}
else
{
switch (*p)
{
case '+':
element._operator = PLUS;
break;
case '-':
element._operator = MINUS;
break;
case '*':
element._operator = MULTIPLY;
break;
case '/':
element._operator = DIV;
break;
default:
return false;
}
elements.push_back(element);
}
p++;
}
return solve(elements, result);
}
double inputAndSolve(bool (*function)(char *, double &))
{
double result;
char expression[1000];
cin.ignore(100, '\n');
while (1)
{
cin.getline(expression, 1000);
if (!function(expression, result))
cout << "输入有误,请重新输入:";
else
return result;
}
}
int main()
{
cout << "请选择一项:" << endl;
cout << "<1> 输入带?引导符的后缀表达式" << endl;
cout << "<2> 输入带空格的后缀表达式" << endl;
cout << "<3> 输入中缀表达式" << endl << endl;
cout << "请输入:";
int choice;
double result;
while (!(cin >> choice) || choice < 1 || choice > 3)
{
cout << "您的输入有误,请重新输入:";
cin.clear();
cin.ignore(100, '\n');
}
switch (choice)
{
case 1:
cout << "请输入后缀表达式:";
result = inputAndSolve(suffix_q);
break;
case 2:
cout << "请输入后缀表达式:";
result = inputAndSolve(suffix_space);
break;
case 3:
cout << "请输入中缀表达式:";
result = inputAndSolve(infix);
break;
}
cout << "求值结果:" << result << endl;
return 0;
}