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

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

不同的运算符有不同的优先度
当优先度高的符号进入栈中 所有比它优先度低的符号都要弹出
对 就是这么霸道
没有优先度 没有运算符能让它弹出 它也不能让别的运算符弹出 就是说运算过程中会被一直压在栈底
*/是 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. springmvc实现文件下载到Android手机设备pda端

    1:首先要添加相关得jar文件,在pom.xml中 <dependency> <groupId>commons-fileupload</groupId> <a ...

  2. 零基础逆向工程40_Win32_14_枚举窗口_模拟鼠标键盘

    1 查找窗口 1.1 代码案例 //查找指定窗口 TCHAR szTitle[MAX_PATH] = {0}; HWND hwnd = ::FindWindow(TEXT("#32770&q ...

  3. APK加固之静态脱壳机编写入门

    目录: 0x00APK加固简介与静态脱壳机的编写思路 1.大家都知道Android中的程序反编译比较简单,辛苦开发出一个APK轻易被人反编译了,所以现在就有很多APK加固的第三方平台,比如爱加密和梆梆 ...

  4. 文件上传PHP

    <?php $targetIp = GetIP(); $fileUpload = 'fileUpload'; $frameCount = 'frameCount'; $fileName = $_ ...

  5. js报错 object is not a function

    主要是js函数名重名了,重命名就可以了.

  6. eclipse 中 添加 tomcat后,启动访问时出现404

    1.切换到 server view. 2.双击出问题的 Server,出现如下页面. 3.选中Server,右键,点击选项卡的 Publish,就能进行编辑. 4.Server path 选中第二项: ...

  7. [SVN]TortoiseSVN工具培训5─常见问题解决

    1.文件提交时状态异常 产生原因:操作不当 解决方法:使用SVN的clean up命令 2.权限不足 产生原因:当前用户权限不足 解决方法:找配置管理员申请权限 3.网络故障 产生原因:无法访问到配置 ...

  8. lucene中文学习地址推荐

    Lucene原理与代码分析http://www.cnblogs.com/forfuture1978/category/300665.html Lucene5.5学习(1)-初尝Lucene全文检索引擎 ...

  9. http 状态码集合

    HTTP常见状态码 200 301 302 404 500   HTTP状态码(HTTP Status Code) 状态码并不是每个都有,为了后期扩展.[update20170505] 一些常见的状态 ...

  10. TP5.1:实现分页

    前提: (1)为了让分页变得更加好看,我的案例加载了bootstrap和jq的文件,具体操作请参考:http://www.cnblogs.com/finalanddistance/p/9033916. ...