威海市网站建设_网站建设公司_Tailwind CSS_seo优化
2026/1/9 15:48:24 网站建设 项目流程

​欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总贴:历年蓝桥杯青少组省赛国赛C++中/高级组真题解析 | 汇总


【题目来源】

洛谷:[B4278 蓝桥杯青少年组国赛 2023] 简单算术题 - 洛谷

【题目描述】

给定一道没有括号的四则混合运算算术题(可能包含多余的空格),请编程计算出结果。

运算规则如下:

  1. 既有乘、除法又有加、减法的,要先算乘除法,再算加减法
  2. 同级运算时,要从左往右按顺序计算
  3. 所有除法运算的结果都只保留整数部分(直接舍弃小数部分)

例如:当算术题为2 + 3 * 4 - 10 / 6 + 1 / 2 * 4时,优先计算乘除法,有3 * 4 = 12,10 / 6 = 1,1 / 2 * 4 = 0;然后再计算加减法,2 + 3 * 4 - 10 / 6 + 1 / 2 * 4 = 2 + 12 - 1 + 0 = 13,故输出13。

【输入】

输入一个字符串,表示算术题,5 ≤ 字符串长度 ≤ 100000 5\le 字符串长度\le 1000005字符串长度100000,字符串中只包含数字字符以及“+”、“-”、“*”、“/”运算符,不含括号,可能包含空格;

算式中的运算数范围:1 ≤ 运算数 ≤ 200 1\le 运算数\le 2001运算数200

【输出】

输出一个整数,表示算术题的计算结果。

题目数据保证算式的每一步运算的结果都在− 2 × 10 9 ∼ 2 × 10 9 -2\times 10^9 \sim 2\times 10^92×1092×109之间。

【输入样例】

2+3*4-10/6+1/2*4

【输出样例】

13

【算法标签】

《洛谷 B4278 简单算术题》 #字符串# #栈# #蓝桥杯青少年组# #2023#

【代码详解】

// 引入所有标准库头文件,方便使用各种标准库功能#include<bits/stdc++.h>// 使用标准命名空间,避免每次使用标准库函数时都需要加 std:: 前缀usingnamespacestd;// 定义宏 int 为 long long,以便处理大整数#defineintlonglong// 定义全局字符串变量 s,用于存储输入的表达式string s;// 定义两个栈:// st_n:用于存储操作数(数字)// st_c:用于存储操作符(如 +, -, *, /)stack<int>st_n;stack<char>st_c;// 主函数,程序的入口点,使用 signed 作为返回类型以匹配宏定义的 int 为 long longsignedmain(){// 读取输入的表达式,使用 getline 读取整行,包括可能的空格// cin >> s; // 原始注释掉的代码,使用 getline 替代以读取整行getline(cin,s);// 移除字符串 s 中的所有空格,以便处理连续的数字和操作符s.erase(remove(s.begin(),s.end(),' '),s.end());// 获取处理后字符串 s 的长度intls=s.size();// 初始化变量 t,用于临时存储当前读取的数字intt=0;// 循环遍历字符串 s 的每一个字符,包括一个额外的位置以处理结尾for(inti=0;i<=ls;i++){// 如果当前字符是数字,则将其转换为整数并累加到 t 中if(isdigit(s[i])){t=t*10+s[i]-'0';}else{// 如果当前字符不是数字(即操作符或字符串结尾),则处理栈中的操作符// 如果操作符栈 st_c 不为空,并且栈顶操作符是 '*',则进行乘法运算if(!st_c.empty()&&st_c.top()=='*'){t=st_n.top()*t;st_n.pop();// 弹出栈顶的操作数st_c.pop();// 弹出栈顶的操作符 '*'}// 如果操作符栈 st_c 不为空,并且栈顶操作符是 '/',则进行除法运算elseif(!st_c.empty()&&st_c.top()=='/'){t=st_n.top()/t;st_n.pop();// 弹出栈顶的操作数st_c.pop();// 弹出栈顶的操作符 '/'}// 将当前计算结果 t 压入操作数栈 st_nst_n.push(t);// 重置临时变量 t 为 0,准备读取下一个数字t=0;// 如果当前字符是操作符(+、-、*、/),则将其压入操作符栈 st_cif(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')st_c.push(s[i]);}}// 定义两个临时栈,用于重新组织和处理操作数与操作符stack<int>temp_nums;stack<char>temp_ops;// 将操作数栈 st_n 中的所有元素弹出并压入临时栈 temp_nums,实现逆序while(!st_n.empty()){temp_nums.push(st_n.top());st_n.pop();}// 将操作符栈 st_c 中的所有元素弹出并压入临时栈 temp_ops,实现逆序while(!st_c.empty()){temp_ops.push(st_c.top());st_c.pop();}// 循环处理临时操作符栈 temp_ops 中的所有操作符while(!temp_ops.empty()){// 弹出临时操作数栈 temp_nums 的栈顶元素作为操作数 ainta=temp_nums.top();temp_nums.pop();// 弹出临时操作数栈 temp_nums 的栈顶元素作为操作数 bintb=temp_nums.top();temp_nums.pop();// 根据临时操作符栈 temp_ops 的栈顶操作符进行相应的运算if(temp_ops.top()=='+'){// 如果操作符是 '+',则将操作数 b 和 a 相加,并将结果压入 temp_numstemp_nums.push(a+b);}else{// 如果操作符不是 '+'(即 '-'),则将操作数 b 和 a 相减,并将结果压入 temp_numstemp_nums.push(a-b);}// 弹出临时操作符栈 temp_ops 的栈顶操作符temp_ops.pop();}// 输出最终的计算结果,即临时操作数栈 temp_nums 的栈顶元素cout<<temp_nums.top();// 程序正常结束,返回 0return0;}

【运行结果】

2+3*4-10/6+1/2*4 13

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

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

立即咨询