题解:AcWing 6031 计算
2026/4/30 23:02:47 网站建设 项目流程

本文分享的必刷题目是从蓝桥云课洛谷AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

AcWing:6031. 计算 - AcWing题库

【题目描述】

小明在你的帮助下,破密了 Ferrari 设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有()0-9+-*/^,求出的值就是密码。

小明数学学得不好,还需你帮他的忙。(/用整数除法)

【输入】

1 11行,为一个算式。

【输出】

1 11行,就是密码。

【输入样例】

1+(3+2)*(7^2+6*9)/(2)

【输出样例】

258

【算法标签】

#栈#

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;// 返回运算符c的优先级intpri(charc){switch(c){case'(':// 左括号优先级最高{return5;}case'^':// 幂运算{return4;}case'*':// 乘法case'/':// 除法{return3;}case'+':// 加法case'-':// 减法{return2;}case')':// 右括号优先级最低{return1;}}}// 计算 a 和 b 通过运算符 c 的结果intcalc(inta,intb,charc){switch(c){case'+':// 加法{returna+b;}case'-':// 减法{returna-b;}case'*':// 乘法{returna*b;}case'/':// 除法{returna/b;}case'^':// 幂运算{returnpow(a,b);}}}intmain(){stack<int>nStk;// 数字栈stack<char>cStk;// 运算符栈intnum=0;// 当前正在读取的数字boolisNum=false;// 标记是否正在读取数字string s;// 输入表达式cin>>s;// 输入表达式s.push_back(')');// 在表达式末尾添加右括号,确保最终计算for(inti=0;i<s.length();++i)// 遍历表达式{if(s[i]>='0'&&s[i]<='9')// 如果是数字字符{num=num*10+s[i]-'0';// 构建多位数isNum=true;// 标记正在读取数字}else// s[i]是运算符{if(isNum)// 如果之前正在读取数字{nStk.push(num);// 将完整数字压入数字栈num=0;// 重置数字isNum=false;// 标记数字读取结束}// 当运算符栈不为空,且当前运算符优先级 <= 栈顶运算符优先级// 且栈顶不是左括号时,进行计算while(!(cStk.empty()||pri(s[i])>pri(cStk.top())||cStk.top()=='(')){// 从数字栈中弹出两个操作数intb=nStk.top();nStk.pop();inta=nStk.top();nStk.pop();// 计算结果并压回数字栈nStk.push(calc(a,b,cStk.top()));// 弹出已使用的运算符cStk.pop();}// 处理括号匹配if(!cStk.empty()&&cStk.top()=='('&&s[i]==')'){cStk.pop();// 弹出左括号}else{cStk.push(s[i]);// 将当前运算符压入栈}}}cout<<nStk.top();// 输出最终结果return0;// 程序正常结束}

【运行结果】

1+(3+2)*(7^2+6*9)/(2) 258

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询