我用了两个栈
一个用来存数字 一个用来存运算符

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

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

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

还有啊 我这个版本是非高精度的
不过原理都一样
不懂高精度处理的话 可以看我另一篇文章^^
https://blog.csdn.net/qq_42887568/article/details/81435771

include <bits/stdc++.h>
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 ;
}

c++ 计算器 带括号 代码实现的更多相关文章

  1. Python带括号的计算器

    带括号的计算器也是第一个自我感觉完成最好的 毕竟真的弄了一个多星期 虽然前期这路真的很难走  我会努力加油  将Python学好学踏实 参考了两位博主的文章 http://www.cnblogs.co ...

  2. 使用python开发一个能够计算带括号的复杂表达式的计算器(只支持加减乘除)

    使用到了模块re,正则,字典等 # 实现简单的加减乘除括号等运算 # Calculator def calculator(expression): print(expression) import r ...

  3. js中new函数后带括号和不带括号的区别

    用new创建构造函数的实例时,通常情况下new 的构造函数后面需要带括号(譬如:new Parent()). 有些情况下new的构造函数后带括号和不带括号的情况一致,譬如: function Pare ...

  4. 修改phpcms会员登录后头部登陆条的会员名称不带括号

    phpcms会员登录后显示会员名称是带括号的,现在把他修改成不带括号. 找到函数库libs/functions/global.func.php,修改如下即可: function get_nicknam ...

  5. json转换数据后面参数要带ture,代码

    强大的PHP已经提供了内置函数:json_encode() 和 json_decode().很容易理解,json_encode()就是将PHP数组转换成Json.相反,json_decode()就是将 ...

  6. c++ new带括号和不带括号

    在new对象的时候有加上(),有不加(),不知道这个到底是什么区别?比如:CBase *base = new CDerived();CBase *base = new CDeviced; 很多人都说, ...

  7. [转]c++ new带括号和不带括号

    ref:http://m.blog.csdn.net/blog/u012745772/42420443 在new对象的时候有加上(),有不加(),不知道这个到底是什么区别?比如:CBase *base ...

  8. 解决VS Code开发Python3语言自动补全功能不带括号的问题

    Visual Studio Code(以下简称VS Code)用来开发Python3,还是很便利的,本身这个IDE就是轻量级的,才几十兆大小,通过安装插件的方式支持各种语言的开发.界面也美美哒,可以在 ...

  9. Eclipse中Server视图加载项目之后项目名后边有带括号的名字

    用习惯了eclipse工具,因为某种原因需要修改项目名称.结果选择项目,按“F2”成功修改后,使用tomcat进行web发布时,选择“Add and Remove”,发现名字还是以前那个项目名称.即使 ...

随机推荐

  1. 微信小程序实战篇:基于wxcharts.js绘制移动报表

    前言 微信小程序图表插件(wx-charts)是基于canvas绘制,体积小巧,支持图表类型饼图.线图.柱状图 .区域图等图表图形绘制,目前wx-charts是微信小程序图表插件中比较强大好使的一个. ...

  2. 处理移动端自适应布局的方法- calc()与vw

    在处理移动端自适应布局时,目前前端最流行的方法应该就是使用媒体查询,来设置HTML的字体大小,然后用rem为单位对Dom的宽高进行设置,这个方法的优势在于兼容性方面很好,劣势则在于当前市场上不同的机型 ...

  3. Android 关于apk 打包后的地图定位和导航失败的问题

    项目中,使用了高德地图定位,调试的debug包定位完全没有问题,但是签名打包后,却始终无法定位,发现是测试环境下的SHA1码和签名发布版的SHA1码是不同的. 所以我们需要获取发布版的SHA1码: 方 ...

  4. Android基础Activity篇——Intent向下一个活动传递数据

    1.向下一个活动传递数据 String data ="bilibilbilbilbili"; Intent intent1=new Intent(this,secondActivi ...

  5. Android开发从系统图库中选择一张图片的方法

    刚开始学习OpenCv4Android编程,做了个小demo. 就是一个主界面上添加一个ImageView 两个Button控件. 一个Button用来从系统相册选择一张照片: 另一个Button是用 ...

  6. sharepoint2010列表的分页实现迅雷样式效果

    利用ListItemCollectionPosition和AspNetPage分页控件实现,效果图如下: 后台分页代码如下: #region 私有方法 /// <summary> /// ...

  7. centos命令行常用操作

    1.查看某个端口占用 lsof -i tcp:80 2.查看是否安装了防火墙 service iptables status 查看是否启用防火墙/etc/init.d/iptables status ...

  8. COGS 678. 双重回文数

    ★   输入文件:dualpal.in   输出文件:dualpal.out   简单对比时间限制:1 s   内存限制:128 MB Dual Palindromes 双重回文数 描述 [USACO ...

  9. [转载]Memcached缓存服务的简单安装

    1.Linux下的安装方法 下载:wget http://memcached.org/latest tar -zxvf memcached-1.x.x.tar.gz cd memcached-1.x. ...

  10. react组件生命周期过程

    实例化 首次实例化 getDefaultProps getInitialState componentWillMount render componentDidMount 实例化完成后的更新 getI ...