数据结构--栈的应用-表达式求值算法C++(模板类实现)
作者:
AmbitionX
,
2022-05-04 15:14:04
,
所有人可见
,
阅读 241
#include <iostream>
#include <cstring>
using namespace std;
const int Size = 100;
class Expression
{
public:
Expression(string str);
int Compute();
private:
int Comp(char str1, char str2);
string str;
};
Expression :: Expression(string str)
{
this->str = str + "#";
}
int Expression :: Compute()
{
char OPND[Size], OPTR[Size];
OPTR[0] = '#';
int top1 = -1, top2 = 0;
int k, x, y, z, op;
for (int i = 0; str[i] != '\0'; )
{
if (str[i] >= 48 && str[i] <= 57)
OPND[++ top1] = str[i ++] - 48;
else
{
k = Comp(str[i], OPTR[top2]);
if (k == 1) OPTR[++ top2] = str[i++];
else if (k == -1)
{
y = OPND[top1 --];
x = OPND[top1 --];
op = OPTR[top2 --];
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[++ top1] = z;
}
else
{
top2 --;
i++;
}
}
}
return OPND[top1];
}
int Expression :: Comp(char str1, char 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;
}
}
int main()
{
string str;
cout << "请输入一个表达式: " << endl;
cin >> str;
Expression E{str};
int result = E.Compute();
cout << "表达式的结果是: " << result << endl;
return 0;
}