计蒜客 题解
校内考试 计蒜客 题解
题目大意
计算一个含 + - * / ( )
的表达式
思路分析
考虑维护两个栈,一个储存数字,一个储存符号,思考会出现几种情况:
1、数字:
- 直接入栈
2、符号
-
2.1、乘、除、开始括号:
- 因为在四则运算中,这三个符号的优先级最高,所以直接入站
-
2.2、加、减:
- 优先级较低,应该先把栈顶的乘除法进行计算,再将加减入栈。
-
2.3、结束括号:
- 读到结束括号后,就珂以把栈顶的元素一个个拿出来运算,直到拿出开始括号
- 因为在读到加减时会进行乘除运算,所以最后除了紧挨着括号的乘除运算,就只有加减需要运算
3、结束:
- 读完文件后,其实和读到结束括号时是一样的,因为可以把整个表达式看成被一个括号所包围
注意,因为要求从左向右运算,所以要反着读数据
关键代码
//主题循环
string e;//表达式
for(int i=n-1;i>=0;i--){
//读数字
if(e[i]>='0'&&e[i]<='9'){
int nu=e[i]-'0';i--;//移动一位
int len=0;
while(e[i]>='0'&&e[i]<=9){
len++;
int ans=1;for(int i=1;i<=len;i++){
ans*=10;
}//计算位数
nu=nu+(e[i]-'0')*ans;
}
num.push(nu);//num->数字栈
}
//...//
//读到+/-时
if(e[i]=='+'||e[i]=='-'){
//把栈顶的所有乘除都进行计算
while(true){
if(op.empty())break;//防Bug
if(op.top()=='*'||op.top()=='/'){
char opt=op.top();op.pop();
int num1=num.top();num.pop();
int num2=num.top();num.pop();
int nu=opt=='*'?num1*num2:num1/num2;
//三目运算
num.push(nu);
}
else break;
}
}
op.push(e[i]);
//...//
//读到左括号时
if(e[i]=='('){
//进行乘除运算
while(true){
if(op.empty())break;//防Bug
if(op.top()=='*'||op.top()=='/'){
char opt=op.top();op.pop();
int num1=num.top();num.pop();
int num2=num.top();num.pop();
int nu=opt=='*'?num1*num2:num1/num2;
//三目运算
num.push(nu);
}
else break;
}
//进行加减运算
while(op.top()!=')'){
char opt=op.top();op.pop();
int num1=num.top();num.pop();
int num2=num.top();num.pop();
int nu=opt=='+'?num1+num2:num1-num2;
num.push(nu);
}
op.pop();//删除右括号
}
//...//
}
//...//
请注意,这份代码是不完整的。完整代码:云剪贴板
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下