|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<iostream>
using namespace std;
#include<string>
class Expression
{
public:
Expression(string str);
~Expression();
int Compute();
private:
int Comp(char str1, char str2);
string str;
};
Expression::Expression(string str)
{
this->str = str + "#";
}
Expression :: ~Expression()
{
}
int Expression::Compute()
{
char OPND[100], OPTR[100];
OPTR[0] = '#';
int top1 = -1, top2 = 0;
int i, k, x, y, z, op;
for (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;
}
29行错误,错误码:C2784 编译器无法从提供的函数参数中确定模板参数。
29行错误,错误码:C2776 在 property 扩展特性中仅可指定一个 get 函数。 当指定多个 get 函数时,发生此错误。
32行错误,错误码:C2664:
“function”:无法将参数编号从“type1”转换为“type2”
某参数无法转换为所需类型。 如果创建某个类的实例,然后尝试对用 explicit 关键字标记的构造函数进行隐式转换,则可能发生此错误。
如果将临时对象传递给采用指向对象的引用作为参数的函数,则该引用必须是常数引用。
如果使用不是函数所预期的类型的参数调用该函数,则使用适当的构造函数创建临时对象。 然后将该临时对象传递给函数。 在这种情况下,该临时对象用于初始化引用。 在该语言的早期版本中,所有的引用都可以由临时对象进行初始化。
要解决 C2664,
再次检查给定函数的原型,并改正错误信息中指出的参数。
如果需要的话,提供显式转换。
如果某个类在它的一个基类中隐藏了成员,也可能生成 C2664。
|
|