设计一个程序,对输入的以#为结束的算术表达式(包括+,-,*,/,(,) ),首先判断表达式是否含有非法字符(即非+,-,*,/, (,) 之外的字符), 如果含有非法字符,则报错误信息; 如果正确,计算并输出这个表示式的值。 本题希望利用算符优先关系,实现对算术四则混合运算表达式的求值。 【输入格式】 以#为结束符的算术表达式。 【输出格式】 对于每组测试数据算术表达式,如果含有非法字符,输出“NO”,否则输出表达式的值,行尾不得有多余的空格。 要求: 使用STL求解表达式的值。 【样例输入】 3+4*(5-3)# 【样例输出】 11 【样例说明】 输入样例是合法的表达式,因此求表达式的值,并输出11。 【样例输入】 3+;4*(5-3)# 【样例输出】 表达式不合法 【样例说明】 输入样例含不合法的字符';',因此输出“NO”。写出c++的代码
时间: 2024-03-07 21:46:42 浏览: 508
好的,这是C++的代码实现:
```c++
#include <iostream>
#include <stack>
#include <string>
#include <cctype> // 包含isalnum和isdigit函数的头文件
using namespace std;
// 定义优先级
int priority(char c)
{
if(c == '*' || c == '/')
return 2;
else if(c == '+' || c == '-')
return 1;
else
return 0;
}
int main()
{
string expr; // 存储输入的表达式
getline(cin, expr, '#');
stack<int> nums; // 存储数字的栈
stack<char> ops; // 存储操作符的栈
for(int i = 0; i < expr.size(); i++)
{
if(isdigit(expr[i])) // 如果是数字
{
int num = 0;
while(i < expr.size() && isdigit(expr[i]))
{
num = num * 10 + (expr[i] - '0');
i++;
}
i--; // 因为for循环中i会自增,所以这里要减1
nums.push(num);
}
else if(expr[i] == '(') // 如果是左括号,直接入栈
{
ops.push(expr[i]);
}
else if(expr[i] == ')') // 如果是右括号,依次弹出操作符和数字,进行计算
{
while(!ops.empty() && ops.top() != '(')
{
int num2 = nums.top();
nums.pop();
int num1 = nums.top();
nums.pop();
char op = ops.top();
ops.pop();
if(op == '+')
nums.push(num1 + num2);
else if(op == '-')
nums.push(num1 - num2);
else if(op == '*')
nums.push(num1 * num2);
else if(op == '/')
{
if(num2 == 0) // 判断除数是否为0
{
cout << "除数不能为0" << endl;
return 0;
}
nums.push(num1 / num2);
}
}
if(!ops.empty())
ops.pop(); // 弹出左括号
}
else if(expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') // 如果是操作符
{
while(!ops.empty() && ops.top() != '(' && priority(ops.top()) >= priority(expr[i]))
{
int num2 = nums.top();
nums.pop();
int num1 = nums.top();
nums.pop();
char op = ops.top();
ops.pop();
if(op == '+')
nums.push(num1 + num2);
else if(op == '-')
nums.push(num1 - num2);
else if(op == '*')
nums.push(num1 * num2);
else if(op == '/')
{
if(num2 == 0) // 判断除数是否为0
{
cout << "除数不能为0" << endl;
return 0;
}
nums.push(num1 / num2);
}
}
ops.push(expr[i]);
}
else if(!isalnum(expr[i]) && expr[i] != ' ') // 如果是非法字符
{
cout << "表达式含有非法字符" << endl;
return 0;
}
}
while(!ops.empty()) // 将栈中剩余的操作符和数字进行计算
{
int num2 = nums.top();
nums.pop();
int num1 = nums.top();
nums.pop();
char op = ops.top();
ops.pop();
if(op == '+')
nums.push(num1 + num2);
else if(op == '-')
nums.push(num1 - num2);
else if(op == '*')
nums.push(num1 * num2);
else if(op == '/')
{
if(num2 == 0) // 判断除数是否为0
{
cout << "除数不能为0" << endl;
return 0;
}
nums.push(num1 / num2);
}
}
cout << nums.top() << endl; // 输出最终结果
return 0;
}
```
阅读全文