C++计算器怎么写 C++实现四则运算的简单代码【案例】
技术百科
冰火之心
发布时间:2026-01-27
浏览: 次 应使用双栈法解析四则运算表达式,而非std::stringstream或std::stod;维护nums和ops栈,按优先级计算,处理括号与负号,并严格校验输入合法性。
用 std::stringstream 和 std::stod 解析表达式太危险
直接用字符串流或类型转换函数处理用户输入的四则运算表达式(比如 "3 + 4 * 2"),几乎必然出错。这些工具不理解运算符优先级,也不会递归解析括号,std::stod("3 + 4 * 2") 只会读到 3 就停,后面全被忽略。真要这么做,得自己拆分 token、建栈、模拟运算过程——相当于重写一个简易解释器。
推荐用双栈法实现中缀表达式求值(支持 + - * / 和括号)
这是教科书级解法,稳定、易懂、能覆盖常见需求。核心是维护两个栈:nums 存操作数,ops 存运算符。遇到数字就入 nums;遇到运算符时,先检查栈顶是否该立即计算(比如当前是 *,而栈顶是 +,那 + 不能等,得先算掉);遇到左括号无条件入栈,右括号则一路弹出直到左括号。
- 优先级判断用
map:比如{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2} - 注意负号处理:若
-出现在开头或左括号后(如"(-5 + 3)"),应视为一元负号,需补 0 入nums - 除零必须检查:
if (b == 0) throw std::runtime_error("division by zero");
double calc(double a, double b, char op) {
switch(op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': if (b == 0) throw std::runtime_error("division by zero"); return a / b;
}
return 0;
}
别硬啃字符串解析,先用空格分隔再处理更稳妥
如果只要求用户输入带空格的格式(如 "3 + 4 * 或 
"10 / ( 2 - 1 )"),可以先用 std::istringstream 按空格切分 token,再逐个识别数字、运算符、括号。这样避免手写跳过空白、识别多位数、处理小数点等边界问题。
- 读 token 时用
while (iss >> token),token是std::string - 判断
token == "("或token == ")"比判断单个字符更清晰 - 数字用
std::stod(token)安全转换,前提是已确认token不含非法字符
输入验证和错误恢复容易被忽略
真实场景下,用户可能输 "3++4"、"(5 + " 或 "abc * 2"。只靠双栈逻辑无法捕获所有异常,必须在解析前/中加校验:
- 扫描原始字符串,确保每个字符属于
0-9、+-*/()、空格;小数点需成对出现在数字中 - 左右括号数量必须相等,且过程中右括号不能多于左括号
- 连续两个运算符(除一元负号外)非法,如
"3 * + 4" - 计算完成后,
nums应只剩 1 个数,ops应为空,否则说明表达式不完整
这些检查点分散在词法分析和语法计算阶段,漏掉任意一个,程序就可能崩溃或返回错误结果。
# 这是
# 出现在
# 重写
# 弹出
# 只会
# 先用
# 工具
# 递归
# c++
# String
# if
# stream
# 字符串
# 栈
# while
# Token
# map
# throw
# switch
# 类型转换
# 运算符
# 切分
# 字符串解析
# 串流
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 电脑的“网络和共享中心”去哪了_Windows 1
- Windows10怎么卸载预装软件_Windows
- Win11色盲模式怎么开_Win11屏幕颜色滤镜设
- 当网站SEO排名下降时,如何应对?
- c++中如何使用std::variant_c++1
- Windows如何设置登录时的欢迎屏幕背景?(锁屏
- c# 服务器GC和工作站GC的区别和设置
- php订单日志怎么记录物流_php记录订单物流变更
- 如何使用Golang实现路由参数绑定_使用Mux和
- Win11怎么设置虚拟桌面 Win11新建多桌面切
- Win11怎么设置单手模式_Win11触控键盘布局
- Win11怎么激活Windows10_Win11激
- Golang如何避免指针逃逸_Golang逃逸分析
- Win11怎么调整屏幕亮度_Windows 11调
- 如何提升Golang JSON序列化性能_Gola
- c++怎么实现高并发下的无锁队列_c++ std:
- 如何使用Golang管理模块版本_Golanggo
- Python解释执行模型_字节码流程说明【指导】
- Windows怎样关闭Edge新标签页广告_Win
- 如何理解Go指针和内存分配关系_Go Pointe
- windows 10专注助手怎么关闭_window
- Mac电脑进水了怎么办_MacBook进水后紧急处
- c++ std::future和std::prom
- Win11怎么自动隐藏任务栏_Win11全屏显示设
- Python网络超时处理_健壮性设计说明【指导】
- Win11键盘快捷键大全_Windows 11常用
- Win11任务栏怎么放到顶部_Win11修改任务栏
- Windows10如何更改系统字体大小_Win10
- Go语言中slice追加操作的底层共享机制解析
- 如何在JavaScript中动态拼接PHP的bas
- PythonPandas数据分析教程_数据清洗与处
- Windows10无法识别USB设备描述符请求失败
- Win11怎么设置夜间模式_Windows11显示
- 如何在 VS Code 中正确配置并使用 NumP
- Windows音频驱动无声音原因解析_声卡驱动错误
- php怎么下载安装后无法解析php文件_服务器配置
- Win10怎样清理C盘浏览器缓存_Win10清理浏
- LINUX的SELinux是什么_详解LINUX强
- PHP中require语句后直接调用返回对象方法的
- c++怎么设置线程优先级与cpu亲和性_c++ 多
- c++如何实现多态性_c++ 虚函数表原理与动态绑
- 微信里的php文件怎么变mp4_微信接收php转m
- Win11怎么设置ip地址_Windows 11手
- Django 测试数据库表缺失与字段未创建问题的完
- Win11怎么清理C盘系统错误报告_Win11清理
- Win10怎样安装PPT模板_Win10安装PPT
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- 如何使用Golang处理网络超时错误_Golang
- 如何优化Golang内存分配与GC调度_Golan
- Windows7怎么找回经典开始菜单_Window

QQ客服