解题思路:自己看着代码 把案例过一遍 代码就明白了 自己再多敲几遍
注意事项:
参考代码:
#include<bits/stdc++.h>
using namespace std;
stack<int>num;//存放数字
stack<char>s;//存放运算符
char c[50];//存放原始式子
int x;
//计算 取出前面俩个数和运算符计算 把新得的数入栈
void f1()
{
int la = num.top();
num.pop();
int lb = num.top();
num.pop();
char c = s.top();
s.pop();
if(c == '+') num.push(la+lb);
if(c == '-') num.push(lb-la);
if(c == '*') num.push(la*lb);
if(c == '/') num.push(lb/la);
if(c == '^') num.push(pow(lb,la));
}
//符号优先级
int f2(char ch){
if(ch=='^')return 3;
if(ch=='*'||ch=='/')return 2;
if(ch=='+'||ch=='-')return 1;
return 0;
}
int main()
{
// 从下标为1输入
cin >> c+1;
//将c[0]赋值为左括号 为计算最后的式子
c[0] = '(';
//将c的最后一个赋值为右括号 与第一个匹配
c[strlen(c)] = ')';
// flag 为标记 将俩个运算符之间的数字标记
int flag = 0;
//x存放可能会有的多位数
x = 0;
//遍历
for(int i = 0 ; i < strlen(c) ;i++)
{
//为数字
if(c[i] >= '0' && c[i] <= '9')
{
x = x * 10 + c[i] - '0';
flag = 1;
//既然是数字 计算一下就可以跳过了
continue;
}
if(flag == 1)
{
//将所得数字存放在num栈里面 x和flag 重置
num.push(x);
x = 0,flag = 0;
}
if(c[i] == '(')
{
//如果是左括号进s栈就行 然后结束本轮循环
s.push(c[i]);
continue;
}
if(c[i] == ')')
{
//计算俩个括号之间的 遇到左括号结束
while(s.top() != '(')
f1();
//将左括号移出栈
s.pop();
// 结束本次循环
continue;
}
//如果s栈为空 则遇到运算符号直接进栈
if(s.empty()) s.push(c[i]);
else
{
//这里比较运算符号的优先级
while(f2(s.top()) >= f2(c[i]))
f1();
//再将该运算符号入栈s
s.push(c[i]);
}
}
//最后所得就是要求值
cout << num.top();
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复