完整代码没有显示
时间: 2023-11-16 10:04:48 浏览: 29
抱歉,可能是由于文本长度限制,完整代码没有显示出来。以下是完整代码:
```cpp
#include <iostream>
#include <memory>
#include <vector>
#include <string>
#include <cstring>
using namespace std;
class Token {
public:
virtual bool isOperator() const = 0;
};
class OperatorToken : public Token {
public:
char op;
int priority;
OperatorToken(char _op) :op(_op) {
if (op == '+' || op == '-')priority = 1;
else if (op == '*' || op == '/')priority = 2;
else priority = -1;
}
bool isOperator() const override {
return true;
}
bool is_prior(const OperatorToken& ot) const {
return priority <= ot.priority;
}
};
class ValueToken : public Token {
public:
long long value;
ValueToken(long long _value) :value(_value) {}
bool isOperator() const override {
return false;
}
};
vector<shared_ptr<Token>> pre_process(string& s) {
vector<shared_ptr<Token>> res;
int i = 0, n = s.size();
while (i < n) {
if (s[i] == ' ')++i;
else if (isdigit(s[i])) {
long long num = 0;
while (i < n && isdigit(s[i])) {
num = num * 10 + (s[i] - '0');
++i;
}
res.push_back(make_shared<ValueToken>(num));
}
else {
res.push_back(make_shared<OperatorToken>(s[i]));
++i;
}
}
return res;
}
void compute(stack<OperatorToken*>& optrs, stack<long long>& vals) {
auto op = optrs.top();
optrs.pop();
auto b = vals.top();
vals.pop();
auto a = vals.top();
vals.pop();
long long res;
if (op->op == '+')res = a + b;
else if (op->op == '-')res = a - b;
else if (op->op == '*')res = a * b;
else if (op->op == '/')res = a / b;
else res = 0;
vals.push(res);
delete op;
}
int main() {
string string1;
getline(cin, string1);
auto s = pre_process(string1);
stack<OperatorToken*> optrs;
stack<long long> vals;
optrs.push(dynamic_cast<OperatorToken*>(s[0].get()));
try {
for (auto& ptoken : s) {
if (ptoken == s[0])continue;
if (!ptoken->isOperator())vals.push(dynamic_cast<ValueToken*>(ptoken.get())->value);
else {
auto ptr = dynamic_cast<OperatorToken*>(ptoken.get());
while (!ptr->is_prior(*optrs.top())) {
compute(optrs, vals);
}
optrs.push(ptr);
}
}
if (vals.size() != 1 || optrs.size() != 2)throw exception();
}
catch (exception e) {
cout << "Error";
return 0;
}
cout << vals.top();
return 0;
}
```
请注意,由于这是一个简单的控制台程序,因此您需要在本地编译和运行它。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)