当前位置: 首页 > news >正文

嵌套类问题解题模板(模拟计算器)

用到数字栈和符号栈

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int where;

// 提前声明
int f(const string& s, int i);

void push(vector<int>& numbers,
vector<char>& ops,
int cur,
char op) {
int n = numbers.size();

// 前一个运算符是加减,当前数字直接加入
if (n == 0 || ops[n - 1] == '+' || ops[n - 1] == '-') {
numbers.push_back(cur);
ops.push_back(op);
} else {
// 前一个运算符是乘除,立即计算
int topNumber = numbers[n - 1];
char topOp = ops[n - 1];

if (topOp == '*') {
numbers[n - 1] = topNumber * cur;
} else {
numbers[n - 1] = topNumber / cur;
}

ops[n - 1] = op;
}
}

int compute(const vector<int>& numbers,
const vector<char>& ops) {
int n = numbers.size();
int ans = numbers[0];

for (int i = 1; i < n; ++i) {
if (ops[i - 1] == '+') {
ans += numbers[i];
} else {
ans -= numbers[i];
}
}

return ans;
}

// 从 s[i] 开始计算
// 遇到字符串结尾或者右括号停止
int f(const string& s, int i) {
int cur = 0;

vector<int> numbers;
vector<char> ops;

while (i < s.size() && s[i] != ')') {
// 读取多位数
if (s[i] >= '0' && s[i] <= '9') {
cur = cur * 10 + (s[i] - '0');
++i;
}

// 遇到运算符
else if (s[i] != '(') {
push(numbers, ops, cur, s[i]);
cur = 0;
++i;
}

// 遇到左括号
else {
cur = f(s, i + 1);

// where 指向右括号
i = where + 1;
}
}

// 把最后一个数字加入
push(numbers, ops, cur, '+');

// 记录当前停止的位置
where = i;

return compute(numbers, ops);
}

int calculate(const string& str) {
where = 0;
return f(str, 0);
}

int main() {
string str;
cin >> str;

cout << calculate(str) << '\n';

return 0;
}

http://www.jsqmd.com/news/1312967/

相关文章:

  • 城通网盘加速终极指南:3步实现10倍下载速度的免费方案
  • CloudFlare JS加密原理与爬虫工程化应对方案详解
  • 2026济南总代理精选:日照减震穿梁伸缩套管选购指南 - geo交流
  • 免费解锁网易云音乐:3分钟掌握NCM格式转换终极指南 [特殊字符]
  • 3步精准测量:用XInputTest免费检测游戏手柄延迟与轮询率
  • 质量好的珍珠棉内托定制厂家地址在哪里?2026年成都地区供应格局与选择参考 - 优质品牌商家
  • 从错误码到可观测性:构建高效系统诊断与协作的工程实践
  • SIM7000X NB-IoT HAT开发指南:从硬件连接到低功耗数据传输实战
  • VCSA存储服务故障排查:解决vPostgres数据库异常导致的虚拟机管理问题
  • 7英寸HDMI显示屏集成方案:从硬件解析到树莓派系统配置全攻略
  • 从零构建一个企业级 ERP 系统:.NET 8 + Vue 全栈实战指南
  • Raspberry Pi Pico微控制器开发指南:从RP2040硬件到MicroPython与C/C++实战
  • 27 岁,我终于做出了自己的游戏!但是一行代码都没写
  • reTerminal D1001扬声器驱动实战:从ALSA配置到Python应用集成
  • 2026年长春押证不押车流程全解析,吉林省辰龙典当有限公司值得关注 - 趣闻早乐评
  • AI视频自动化生成与发布:构建短视频内容生产流水线的完整技术方案
  • 基于Cadence Allegro的8层板DDR接口PCB设计实战指南
  • 3层架构解密:B站直播推流码获取工具的技术实现与优化
  • Docker 部署 CUPS Web:浏览器即可管理打印机与打印任务
  • 2026年8月苏州商铺租赁合同纠纷怎么打_律师选型与实操指南 - 品牌品鉴馆
  • 红花岗区漏水检测与防水补漏,以微创技术守护红色遵义安居(2026.8新) - 超人防水
  • 云服务器API外部连接失败全链路排查指南:从网络到应用层深度解析
  • 3步实现Steam创意工坊模组自由:WorkshopDL跨平台下载指南
  • SD手部修复资源告急!最后372份高精度Hand Anatomy Lora模型即将下架(附迁移兼容性验证表)
  • 免费解锁AMD Ryzen全部性能:5分钟掌握SMUDebugTool终极调试技巧
  • 2026年商用厨房排烟离心风机口碑观察:成都市场主流品牌推荐与选型指南 - 优质品牌商家
  • 揭秘Wireless-AW-CB375NF:从硬件拆解到Wi-Fi 6升级全攻略
  • 仓山区福州漏水检测与防水补漏,以微创技术守护榕城安居(2026.8新) - 超人防水
  • 三大革新维度:重新定义GTA5游戏体验的创造性工具指南
  • 如何为本地音乐库批量下载同步歌词:LRCGET完整指南