blog/archive/design pattern/interpreter_calculator.cpp
2024-03-19 02:45:09 +08:00

102 lines
2.3 KiB
C++

#include <iostream>
#include <string.h>
#include <stack>
using namespace std;
class AbstractExpression
{
public:
virtual int value() = 0;
};
class ValueExpression : public AbstractExpression
{
int val;
public:
ValueExpression(string val)
{
this->val = atoi(val.c_str());
}
int value()
{
return this->val;
}
};
class SymbolExpression : public AbstractExpression
{
AbstractExpression *left, *right;
string symbol;
public:
SymbolExpression(string symbol, AbstractExpression *left, AbstractExpression *right)
{
this->symbol = symbol;
this->left = left;
this->right = right;
}
int value()
{
// 非加即减
if (symbol == "+")
{
return left->value() + right->value();
}
else
{
return left->value() - right->value();
}
}
};
//expression=value|operator
//value=number
//operator='+'|'-'
int main()
{
char str[] = "1+4+5+6-7";
AbstractExpression *exp = new SymbolExpression("+", new ValueExpression("1"), new SymbolExpression("+", new ValueExpression("4"), new SymbolExpression("+", new ValueExpression("5"), new SymbolExpression("-", new ValueExpression("6"), new ValueExpression("7"))))); //反了
cout << "手动构建:" << exp->value() << endl;
stack<AbstractExpression *> stack;
AbstractExpression *expression;
for (int i = 0; i < strlen(str); i++)
{
if (str[i] >= '0')
{
string val;
for (; i < strlen(str); i++)
{
if (str[i] < '0')
{
break;
}
val += str[i];
}
i--;
stack.push(new ValueExpression(val));
}
else
{
string symbol;
symbol += str[i++];
AbstractExpression *exp = stack.top();
stack.pop();
string val;
for (; i < strlen(str); i++)
{
if (str[i] < '0')
{
break;
}
val += str[i];
}
i--;
stack.push(new SymbolExpression(symbol, exp, new ValueExpression(val)));
}
}
expression = stack.top();
cout << "value:" << expression->value() << endl;
return 0;
}