#include<iostream>
using namespace std;
#include<string>
class Expression
{
private:
string str; //表达式
int Compare(char str1, char str2); //比较 str1 和 str2 的优先级
public:
Expression(string str3); //构造函数
~Expression(); //析构函数
double& Compute(); //计算表达式 str 的值
};
//构造函数
Expression::Expression(string str3) :str(str3 + '#') {}
//析构函数
Expression::~Expression() {}
//比较运算符优先级
int Expression::Compare(char str1, char str2)
{
//返回1表示str1的优先级高(入栈),0表示优先级相同,-1表示str2的优先级高(出栈运算)
switch (str1)
{
//加减
case '+': case'-':
if (str2 == '(' || str2 == '#')
{
return 1;
}
else
{
return -1;
}
break;
//乘除
case '*': case '/':
if (str2 == '*' || str2 == '/')
{
return -1;
}
else
{
return 1;
}
break;
//左括号
case '(':
return 1;
break;
//右括号
case ')':
if (str2 == '(')
{
return 0;
}
else
{
return -1;
}
break;
//#号
case '#':
if (str2 == '#')
{
return 0;
}
else
{
return -1;
}
break;
default:
break;
}
}
//计算表达式的值
double& Expression::Compute()
{
double OPND[100]; //定义运算对象的顺序栈
char OPTR[100]; //定义运算符的顺序栈
OPTR[0] = '#'; //栈OPTR初始化为定界符
int top_nd = -1, top_tr = 0; //初始化栈OPND和OPTR(栈顶指针)
double x = 0.0, y = 0.0, z = 0.0; //参加运算的变量
int i = 0, k = 0; //i 为循环的索引, k 为返回的优先级
char op; //参加运算时接收的运算符
for (i = 0; i < this->str.size();) //依次扫描每一个字符
{
//将运算对象压栈
if (this->str[i] >= '0' && this->str[i] <= '9')
{
double value = 0; //定义运算对象的最终形态(整数加小数)
//整数部分
while (this->str[i] >= '0' && this->str[i] <= '9')
{
value = (10 * value + str[i]) - '0';
i++;
}
//小数部分
if (this->str[i] == '.')
{
int r = 10;
i++;
while (this->str[i] >= '0' && this->str[i] <= '9')
{
value += static_cast<double>(this->str[i] - '0') / r;
r = 10 * r;
i++;
}
}
OPND[++top_nd] = value; //value整数包括小数的最终形态入栈
}
//将运算符压栈
else
{
k = this->Compare(this->str[i], OPTR[top_tr]);
if (k == 1) //如果str的优先级高
{
OPTR[++top_tr] = this->str[i++]; //将表达式的运算符压入运算符栈
}
else if (k == -1) //如果str的优先级低
{
y = OPND[top_nd--]; //将运算对象出栈
x = OPND[top_nd--];
op = OPTR[top_tr--]; //op为出栈的运算符
//成功出栈后进行运算
switch (op)
{
case '+':
z = x + y;
break;
case '-':
z = x - y;
break;
case '*':
z = x * y;
break;
case '/':
z = x / y;
break;
default:
break;
}
OPND[++top_nd] = z; //将运算结果压入运算对象栈中
}
else //如果优先级相同
{
top_tr--; //出栈
i++;
}
}
}
return OPND[top_nd]; //运算对象栈的栈顶元素即为运算结果
}
int main()
{
cout << "******************************" << endl
<< "程序功能:表达式求值 " << endl
<< "******************************" << endl;
string str;
cout << "请输入一个表达式:" << endl;
cin >> str;
Expression E(str);
double result = E.Compute();
cout << "表达式的值为:" << result << endl;
system("pause");
return 0;
}
c++实现表达式求值
最新推荐文章于 2024-03-16 20:51:11 发布
1560

被折叠的 条评论
为什么被折叠?



