计算(calc)

【题目描述】 小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”,求出的值就是密码。小明数学学得不好,还需你帮他的忙。(“/”用整数除法)

【输入】 共1行,为一个算式。

【输出】 共1行,就是密码。

【输入样例】 1+(3+2)(7^2+69)/(2)

【输出样例】 258


stack<char>op;

stack<int>sts;

map<char,int>opp;

这题我们可以用两个stack和一个map来做这道题,其中一个stack用来存储数字,还有一个stack用来存储符号,map映射char和int将各个符号的优先级映射为int类型首先给各个符号附上优先级,先不用管括号,遇到反括号就可以直接弹出,括号内的所有符号进行计算

opp<'+'>=opp<'-'>=1;

opp<'*'>=opp<'/'>=2;

opp<'^'>=3;


#include <iostream>
#include <cmath>
#include <stack>
#include <string>
using namespace std;
stack<int> s1;//存放数的栈
stack<char> s2;//存放符号
string s;//用string类型存储更方便,比如字符串拼接
int level(char p)//符号优先级
{
if (p == '+' || p == '-') return 1;
if (p == '*' || p == '/') return 2;
if (p == '^') return 3;
return 0;
}
void calc()
{
int n, m;
n = s1.top();//栈是个倒序的,所以第二个操作数在栈顶
s1.pop();
m = s1.top();//第一个操作数
s1.pop();
char z = s2.top();//符号
s2.pop();
switch (z)
{
case '+':s1.push(m + n);break;
case '-':s1.push(m - n);break;
case '*':s1.push(m * n);break;
case '/':s1.push(m / n);break;
case '^':s1.push(pow(m, n));break;
default:
break;
}
return;
}
int main()
{
cin >> s;
s = '(' + s + ')';//把s两端添加括号,方便最后运算
int i = 0;//下标
char ch = '(';//首位的(
do
{
if (ch == '(')//如果符号是左括号,直接入栈即可
{
s2.push('(');
}
else if (ch == ')')
{
while (s2.top() != '(') calc();//计算括号里所有的
s2.pop();//弹出(
}
else if (ch >= '0' && ch <= '9' || ch == '-' && s[i - 1] == '(')//如果这是个数,或者是个负数
{
int x, y;//x代表数,y代表符号
if (ch == '-') x = 0, y = -1;
else x = ch - '0', y = 1;
char ch0 = s[++i];//ch的下一个符号是否是数字呢? 会不会出现不是多位数呢?
while ('0' <= ch0 && ch0 <= '9')//如果是数字,那么我们就把他转换成int型的整数啊
{
x = x * 10 + (ch0 - '0');//简单的数学知识
ch0 = s[++i];//等同于i = i + 1; ch0 = s[i];
}
x *= y;//正负
s1.push(x);//就找到一个数字了,把他入栈
i--;
}
else//是个符号
{
while (level(ch) <= level(s2.top()))//当前运算符不超过栈顶运算,先算栈顶运算
//举个例子, 1+2*3 乘法比加法优先级高,那么先算乘法
{
calc();
}
s2.push(ch);//直到当前运算符高于栈顶运算符再把运算符存栈
}
} while (ch = s[++i]);//这里挺巧的,读到空字符也就终止了
cout << s1.top() << endl;//栈顶就是答案咯
return 0;
}

计算(calc)的更多相关文章

  1. 计算(calc.cpp)

    计算(calc.cpp) [问题描述] 小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*” ...

  2. 计算(calc.cpp) 这题我搞了2晚上qwq

    终于会了!可喜可贺!可喜可贺!   计算(calc.cpp) [问题描述] 小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)” ...

  3. 原来css也可以计算-calc()使用

    在浏览其他人的源代码时,看到了一个陌生的属性:width:calc(100% - 10px -10px); 出于好奇心,百度了一下,看到了以下这篇文章,http://www.w3cplus.com/c ...

  4. css盒模型宽高混合计算calc

    例如: .element{ width:calc(expression); } 兼容性:在IE9+.FF4.0+.Chrome19+.Safari6+都得到了较好支持,但是在移动端的支持不是很好. 其 ...

  5. calc 多项式计算 (STL版和非STL版) -SilverN

    计算(calc.cpp) [问题描述] 小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*” ...

  6. Front End Developer Questions 前端开发人员问题(二)CSS 后续

    问题来源:http://markyun.github.io/2015/Front-end-Developer-Questions/ 31.视差滚动效果,如何给每页做不同的动画?(回到顶部,向下滑动要再 ...

  7. 小tip:CSS vw让overflow:auto页面滚动条出现时不跳动

    原文地址:http://www.zhangxinxu.com/wordpress/?p=4552 一.水平居中布局与滚动条跳动的千年难题 当前web届,绝大多数的页面间布局都是水平居中布局,主体定个宽 ...

  8. 小tip:纯CSS让overflow:auto页面滚动条出现时不跳动

    本文转载于张鑫旭博客,原文地址:http://www.zhangxinxu.com/wordpress/?p=4552 一.水平居中布局与滚动条跳动的千年难题 当前web届,绝大多数的页面间布局都是水 ...

  9. 【BZOJ-4521】手机号码 数位DP

    4521: [Cqoi2016]手机号码 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 303  Solved: 194[Submit][Status ...

随机推荐

  1. PJSIP 机器人

    摘要: 最近再研究PJSIP,有一个需求,再适当的时候,需要给远程客户端放音,比如:播放一段广告.或者一段音乐.需要采用API来实现. 正文: 最近想用PJSIP做一个机器人,想法比较简单就是获取客户 ...

  2. 使用python制作趣味小游戏—投骰子

    1.模拟真实环境掷骰子 从Python标准库中调用模块:random——random中包含以各种方式生成随机数的函数 从random中引用randint这一函数——骰子都是有固定面数 from ran ...

  3. MySQL常用指令,java,php程序员,数据库工程师必备。程序员小冰常用资料整理

    MySQL常用指令,java,php程序员,数据库工程师必备.程序员小冰常用资料整理 MySQL常用指令(备查) 最常用的显示命令: 1.显示数据库列表. show databases; 2.显示库中 ...

  4. oeasy 教您玩转linux010101查看内核uname

    linux([?l?n?ks]) 是什么????? 咱们这次讲点什么呢?这次咱们讲讲这个 linux([?l?n?ks]),什么是 linux([?l?n?ks])呢?这linux([?l?n?ks] ...

  5. 剑指 Offer 54. 二叉搜索树的第k大节点

    题目描述 给定一棵二叉搜索树,请找出其中第k大的节点. 示例1: 输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2 输出: 4 示例2: 输入: root ...

  6. 无法从NVIDA官网下载安装CUDA安装包?NVIDA官网怎么了?

    最近几天由于不知名的原因,导致很多人无法从官网下载NVIDA的CUDA安装包,下载时,浏览器提示此文件可能危害你的计算机,选择保留下载下来也只是一个42字节的exe文件 双击进行安装又出现以下问题: ...

  7. 利用ANSI转义序列在控制台输出彩色文字

    说明:无论什么语言,只要你的终端能够解释ANSI转义序列(大多数的类unix终端仿真器都能够解释ANSI转义序列,win32控制台则不支持),就能够使用ANSI转义序列输出颜色.这个功能看似鸡肋,但只 ...

  8. CentOS+Phpstudy安装Sqli-Labs

    CentOS+Phpstudy安装Sqli-Labs 安装环境 CentOS 7.5 vmware fusion phpstudy 安装步骤 1. 下载sqli-labs 2. 将sqli-labs ...

  9. find 用正则表达式查找符合yyyy-mm-dd-bddd模式的目录

    yyyy-dd-mm-bddd模式解释: yyyy:年份,如2020 mm:月份,如03 dd:日期,如22 -b:意为备份,-b为固定字符串 ddd:三位序列号,从001~999 符合此格式的目录名 ...

  10. Oracle Sqlplus 三项设置

    显示sql执行时间:set timing on 显示sql execute plan:set autotrace trace exp  关闭 set autotrace off 设置行宽:set li ...