c++ 计算器 带括号 代码实现
我用了两个栈
一个用来存数字 一个用来存运算符
这里引入优先度的概念便于理解
不同的运算符有不同的优先度
当优先度高的符号进入栈中 所有比它优先度低的符号都要弹出
对 就是这么霸道
( 没有优先度 没有运算符能让它弹出 它也不能让别的运算符弹出 就是说运算过程中会被一直压在栈底
*和/是 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++ 计算器 带括号 代码实现的更多相关文章
- Python带括号的计算器
带括号的计算器也是第一个自我感觉完成最好的 毕竟真的弄了一个多星期 虽然前期这路真的很难走 我会努力加油 将Python学好学踏实 参考了两位博主的文章 http://www.cnblogs.co ...
- 使用python开发一个能够计算带括号的复杂表达式的计算器(只支持加减乘除)
使用到了模块re,正则,字典等 # 实现简单的加减乘除括号等运算 # Calculator def calculator(expression): print(expression) import r ...
- js中new函数后带括号和不带括号的区别
用new创建构造函数的实例时,通常情况下new 的构造函数后面需要带括号(譬如:new Parent()). 有些情况下new的构造函数后带括号和不带括号的情况一致,譬如: function Pare ...
- 修改phpcms会员登录后头部登陆条的会员名称不带括号
phpcms会员登录后显示会员名称是带括号的,现在把他修改成不带括号. 找到函数库libs/functions/global.func.php,修改如下即可: function get_nicknam ...
- json转换数据后面参数要带ture,代码
强大的PHP已经提供了内置函数:json_encode() 和 json_decode().很容易理解,json_encode()就是将PHP数组转换成Json.相反,json_decode()就是将 ...
- c++ new带括号和不带括号
在new对象的时候有加上(),有不加(),不知道这个到底是什么区别?比如:CBase *base = new CDerived();CBase *base = new CDeviced; 很多人都说, ...
- [转]c++ new带括号和不带括号
ref:http://m.blog.csdn.net/blog/u012745772/42420443 在new对象的时候有加上(),有不加(),不知道这个到底是什么区别?比如:CBase *base ...
- 解决VS Code开发Python3语言自动补全功能不带括号的问题
Visual Studio Code(以下简称VS Code)用来开发Python3,还是很便利的,本身这个IDE就是轻量级的,才几十兆大小,通过安装插件的方式支持各种语言的开发.界面也美美哒,可以在 ...
- Eclipse中Server视图加载项目之后项目名后边有带括号的名字
用习惯了eclipse工具,因为某种原因需要修改项目名称.结果选择项目,按“F2”成功修改后,使用tomcat进行web发布时,选择“Add and Remove”,发现名字还是以前那个项目名称.即使 ...
随机推荐
- php支付走过的坑(支付宝篇 注册 秘钥 环境等等配置)
支付这东西,说容易也容易,说难也难 代码这玩意还比较好说 但是 如果没有demo 直接去看官方文档 十有八九一脸懵逼 今天就整理一下 支付这块走过的坑 涉及 微信h5支付 支付宝h5支付 (api文档 ...
- canvas的isPoinInPath API实现交互
- POJO详解
转自:http://blog.csdn.net/lushuaiyin/article/details/7436318 一:什么是POJO POJO的名称有多种,pure old java objec ...
- C#实现屏幕指定区域截屏
//string Opath = @"C:/Picture"; //if (Opath.Substring(Opath.Length - 1, 1) != @ ...
- java最大最小堆
堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值. 最大堆和最小堆是二叉堆的两种形式. 最大堆:根结点的键值是所有堆结点键值中最大者. 最小堆:根结 ...
- 项目01-nginx模块
项目01-nginx模块 1.nginx介绍 nginx是一款高性能web服务器和反向代理服务器,在互联网项目中使用非常频繁,尤其其出色的性能以及轻量级进程占用,已经超过了apache的httpd服务 ...
- oracle-插入到数据库中为日期
oracle中创建一个表,其中一个字段为date,当我们进行插入操作 create table xf_allsalestotal ( xf_txdate date not null, xf_store ...
- JSON:使用json_encode函数解析结果为Null
1.首先,数据库中的json数据是这样的 2.仓鼠使用json_encode()函数进行解析json数据时,显示了一个NULL: 3.这时候,我们需要使用,表示在解析json之前,该json是有语法错 ...
- sql:表中数据全部删除之后,重新插入时,从1开始增加
数据库中设置了自增列,有时候需要清楚数据库从新录入数据.最常见的做法就是使用sql语句"delete 表明名"或是直接选中数据,然后删除数据.但是再次插入数据的时候,你就会发现自增 ...
- 西门子 S7-1500 PLC,使用手轮控制伺服电机
西门子 S7-1500 PLC,使用手轮控制伺服电机 本文描述了一种,1500PLC使用叠加定位的方法,实现手轮操作的方法. 手轮操作需要的功能 数控机床等设备上的电子手轮,起源于机械手轮.机械手轮是 ...