博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ 计算器 带括号 代码实现
阅读量:4511 次
发布时间:2019-06-08

本文共 2155 字,大约阅读时间需要 7 分钟。

我用了两个栈

一个用来存数字 一个用来存运算符

这里引入优先度的概念便于理解

不同的运算符有不同的优先度

当优先度高的符号进入栈中 所有比它优先度低的符号都要弹出
对 就是这么霸道
没有优先度 没有运算符能让它弹出 它也不能让别的运算符弹出 就是说运算过程中会被一直压在栈底
*/是 1
+-的优先度都是 2
最厉害的是 优先度为3 读到它的时候 栈的头指针要一直向下走 不断弹出运算符 直到碰到第一个为止
因为右括号要赶去左括号身边保护它呀

开始我也很懵的

后来自己手动画了两个栈试了几组数据就搞明白了^^
这里就举一个例子吧

这里写图片描述

这里写图片描述

还有啊 我这个版本是非高精度的

不过原理都一样
不懂高精度处理的话 可以看我另一篇文章^^

include 
using namespace std;char a[100] ;char fz[100] ; // 符号栈 int sz[100] ; // 数字栈 int fhead = 0 ; // 符号栈指针 int shead = 0 ; // 数字栈指针 void math(char f) // 从数字栈中取出栈顶的两个数字 进行 f 运算 结果继续放在栈中 { switch(f) { case '+' : sz[-- shead] += sz[shead + 1] ; break ; case '-' : sz[-- shead] -= sz[shead + 1] ; break ; case '*' : sz[-- shead] *= sz[shead + 1] ; break ; case '/' : sz[-- shead] /= sz[shead + 1] ; break ; } -- fhead ; sz[shead + 1] = 0 ;}int main(){ gets(a); int len = strlen(a)-1; for(int i = 0 ; i <= len ; ++ i ) { // 如果读到 "(" 则直接放入栈中 if(a[i] == '(' ) { fz[++ fhead] = a[i] ; continue ; } // 如果读到 ")" 则将 "(" 之前的运算符全部出栈 if(a[i]==')') { while(fz[fhead] != '(') math(fz[fhead]) ; -- fhead ; continue ; } // 读到数字直接放在数字栈顶就ok啦 if(a[i] >= '0' && a[i] <= '9'){ ++ shead ; while(a[i] >= '0' && a[i] <= '9') sz[shead] = sz[shead] *10 + a[i] - '0' ,i++; i--; continue; } else { if(a[i] == '/' || a[i] == '*'){ // 如果读到 "/" 或 "*" 直接放在符号栈栈顶 fz[++fhead] = a[i]; continue; } else while(fz[fhead] == '*' || fz[fhead] == '/' || fz[fhead] == a[i]){ // 如果读到 "+" 或 "-" // 则将栈顶跟自己一样的符号和 "/" "*" 全部弹出 // 这个可以手动列几个式子体会一下 (^-^) math(fz[fhead]); } fz[++ fhead] = a[i] ; } } while(fhead != 0) { math(fz[fhead]) ; } // 当栈中仅有一个数字的时候 运算式的答案就是它啦 cout << sz[shead] ; return 0 ;}

转载于:https://www.cnblogs.com/GC-hahaha/p/9457720.html

你可能感兴趣的文章
端口作用
查看>>
不同web应用登录方案
查看>>
利用css制作横向和纵向时间轴
查看>>
Generic(泛型)
查看>>
009 如何更好地进行沟通
查看>>
NFC NDEF vcard
查看>>
mininet test
查看>>
OOP
查看>>
找出数组中的重复元素
查看>>
Apache服务器配置
查看>>
ClickOnce清单签名取消后依然读取证书的问题
查看>>
POJ 1083
查看>>
单变量微积分笔记16——定积分的应用1(对数与面积)
查看>>
ACM模板——最短路
查看>>
实验3 分支语句和循环语句(1)
查看>>
JSP页面上添加Fckeditor
查看>>
scrapyd spiderkeeper docker部署
查看>>
Qt教程
查看>>
http://linux-mtd.infradead.org/doc/nand.html nand
查看>>
Verilog语言:还真的是人格分裂的语言
查看>>