解题思路:
注意事项:
参考代码:
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int cal(string exp)
{
stack<int> numb;
stack<char> oper;
for (int i = 0; i < exp.length(); i++)
{ //if (isdigit(exp[i]))
//{
// int num = exp[i] - '0';
// numb.push(num);
//}弊端是只能处理个位数
if (isdigit(exp[i]))
{
int num = 0;
while (i < exp.length() && isdigit(exp[i]))
{
num = num * 10 + (exp[i] - '0');
i++;//数字字符是一个一个检测百位数字从个位开始累加
}
numb.push(num);
i--;//因此到这里不用担心不够减
}
else if (exp[i] == '(')
{
oper.push(exp[i]);
}
else if (exp[i] == ')')
{
while (!oper.empty() && oper.top() != '(')
{
int op2 = numb.top();
numb.pop();
int op1 = numb.top();
numb.pop();
char op = oper.top();
oper.pop();
if (op == '+') {
numb.push(op1 + op2);
}
else if (op == '-') {
numb.push(op1 - op2);
}
else if (op == '*') {
numb.push(op1 * op2);
}
else if (op == '/') {
numb.push(op1 / op2);
}
}
oper.pop(); // 弹出 '('
}
else if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/')
{
while (!oper.empty() && oper.top() != '(' && (oper.top() == '*' || oper.top() == '/'))
{
int op2 = numb.top();
numb.pop();
int op1 = numb.top();
numb.pop();
char op = oper.top();
oper.pop();
if (op == '+') {
numb.push(op1 + op2);
}
else if (op == '-') {
numb.push(op1 - op2);
}
else if (op == '*') {
numb.push(op1 * op2);
}
else if (op == '/') {
numb.push(op1 / op2);
}
}
oper.push(exp[i]);
}
}
while (!oper.empty()) //这段代码的存在的意义就是进行一些简单的加减法
{//因为上面的while循环把+ - 直接筛选掉了 没有到乘除是进不去的
int op2 = numb.top();
numb.pop();
int op1 = numb.top();
numb.pop();
char op = oper.top();
oper.pop();
if (op == '+') {
numb.push(op1 + op2);
}
else if (op == '-') {
numb.push(op1 - op2);
}
else if (op == '*') {
numb.push(op1 * op2);
}
else if (op == '/') {
numb.push(op1 / op2);
}
}
return numb.top();
}
int main() {
string exp;
while (getline(cin, exp))
{
if (exp == "#")
break;
int result = cal(exp);
cout << result << endl;
}
return 0;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复