又是大模拟淦淦淦淦淦淦淦


思路:

这道题我居然用的队列orz。

言归正传,这道题就是模拟计算器。从读题目样例可以发现,数字的个数只比符号的个数多一个,那么这就给我们了思路:用队列,先提前放出一个数,每弹出一个字符,就处理两个数。

实现:

分三步

1.先把这输入的那一串序列分成两段,一段全是数字,一段全是字符。因为是输入一行,所以我们可以用到一个函数atoi(word.c_str()),将字符数字转化为数字,具体用法代码里。并且由于有空格,可以遇到空格就结束这一段输入的字符串,然后转化为数字,而符号过了必定是数字,符号只有一位,所以输入到+ - * /时,直接++循环函数,开始输入数字。

2.因为优先级,先处理* /。跟思路一样,先用一个last存储一开始的或者是运算完* /后需要留到下一次计算的,然后用另外一个变量存储当前到那个值了,把当前的符号判断,若是* /就计算,若不是,则直接把last存放进+ -计算的队列了,符号也是,把当前的变量赋值给last,进行下一次* /运算。

3.最后处理加减,这就简单了撒我就不说了。还是跟* /一样的思路, 跟上面的一样,我真不讲了(狗头)。

代码:

#include <bits/stdc++.h>
using namespace std;
queue<double> num; //处理*/用
queue<char> c;
queue<double> numm; //处理+-用
queue<char> cc;
string x , word;
int main(){
while(1){
getline(cin , x);
if(x == "0") break;
while(!num.empty()) num.pop(); //多组数据需清空
while(!c.empty()) c.pop();
while(!numm.empty()) numm.pop();
while(!cc.empty()) cc.pop();
word = "";
for(int i = 0; i < x.size(); i++){
if(x[i] != ' '){
if(x[i] == '+' || x[i] == '-' || x[i] == '*' || x[i] == '/'){
c.push(x[i]);
i++; //直接下一个,避免又一次空格
}else{
word += x[i]; //把这一位赋值给当前的数字
}
}else{
int n = atoi(word.c_str());
num.push(n);
word = "";
}
if(i == x.size() - 1){ //!!!!!这里需要注意一下,最后一个没有空格的,所以要特判
double n = atoi(word.c_str()); //内个string转int的函数,大概格式是这样的,word换成需要转化的字符就OK,其他不变
num.push(n);
word = ""; //多余的
}
}
double a , last;
char st;
int len = num.size(); //!!!!!下面的循环的第二个不能用 num.size(),我就错了,因为num.size()一直在改变的,要重新弄一个
for(int i = 1; i <= len; i++){
if(i == 1){ //因为数字数大于字符数,所以第一个提前取出
last = num.front();
num.pop();
}else{
st = c.front() , a = num.front();
c.pop() , num.pop();
if(st == '*'){
last = last * a;
}
if(st == '/'){
last = last / a;
}
if(st == '+' || st == '-'){
numm.push(last);
last = a;
cc.push(st);
}
if(i == len) numm.push(last); //同理,这里因为没有符号了,所以特判一下,加进去
}
}
double ans;
len = numm.size();
for(int i = 1; i <= len; i++){
if(i == 1){
ans = numm.front();
numm.pop();
}else{
st = cc.front() , a = numm.front();
cc.pop() , numm.pop();
if(st == '+'){
ans += a;
}else{
ans -= a;
}
}
}
printf("%.2f\n" , ans);
}
return 0;
}

吐槽:讲道理这道题不用栈就离谱。思路好想,比较考验编码能力吧。

《算法笔记》6.7小节 问题 A: 简单计算器的更多相关文章

  1. 算法笔记_071:SPFA算法简单介绍(Java)

    目录 1 问题描述 2 解决方案 2.1 具体编码   1 问题描述 何为spfa(Shortest Path Faster Algorithm)算法? spfa算法功能:给定一个加权连通图,选取一个 ...

  2. 算法笔记(c++)--01背包问题

    算法笔记(c++)--经典01背包问题 算法解释起来太抽象了.也不是很好理解,最好的办法就是一步步写出来. 背包问题的核心在于m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+ ...

  3. kNN算法笔记

    kNN算法笔记 标签(空格分隔): 机器学习 kNN是什么 kNN算法是k-NearestNeighbor算法,也就是k邻近算法.是监督学习的一种.所谓监督学习就是有训练数据,训练数据有label标好 ...

  4. 算法笔记_023:拓扑排序(Java)

    目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...

  5. 算法笔记_075:蓝桥杯练习 最短路(Java)

    目录 1 问题描述 2 解决方案 2.1 floyd算法解决 2.2 spfa算法解决   1 问题描述 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从 ...

  6. tensorflow笔记:流程,概念和简单代码注释

    tensorflow是google在2015年开源的深度学习框架,可以很方便的检验算法效果.这两天看了看官方的tutorial,极客学院的文档,以及综合tensorflow的源码,把自己的心得整理了一 ...

  7. 三维重建7:Visual SLAM算法笔记

    VSLAM研究了几十年,新的东西不是很多,三维重建的VSLAM方法可以用一篇文章总结一下. 此文是一个好的视觉SLAM综述,对视觉SLAM总结比较全面,是SLAM那本书的很好的补充.介绍了基于滤波器的 ...

  8. 《算法笔记》之基础C/C++入门

    开始进行算法笔记的学习,在此纪录下来,同时作为自己日后复习资料. 1.基本语法 #include <iostream> using namespace std; int main(){ c ...

  9. 算法笔记之KMP算法

    本文是<算法笔记>KMP算法章节的阅读笔记,文中主要内容来源于<算法笔记>.本文主要介绍了next数组.KMP算法及其应用以及对KMP算法的优化. KMP算法主要用于解决字符串 ...

随机推荐

  1. Java实现 LeetCode 284 顶端迭代器

    284. 顶端迭代器 给定一个迭代器类的接口,接口包含两个方法: next() 和 hasNext().设计并实现一个支持 peek() 操作的顶端迭代器 – 其本质就是把原本应由 next() 方法 ...

  2. Java实现 LeetCode 171 Excel表列序号

    171. Excel表列序号 给定一个Excel表格中的列名称,返回其相应的列序号. 例如, A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> ...

  3. Java实现 蓝桥杯VIP 算法提高 数字黑洞

    算法提高 数字黑洞 时间限制:1.0s 内存限制:256.0MB 问题描述 任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律: 1)将组成该四位数的四个数字由大到小排列,形成由这四个 ...

  4. Java实现 蓝桥杯VIP 算法提高 分分钟的碎碎念

    算法提高 分分钟的碎碎念 时间限制:1.0s 内存限制:256.0MB 问题描述 以前有个孩子,他分分钟都在碎碎念.不过,他的念头之间是有因果关系的.他会在本子里记录每一个念头,并用箭头画出这个念头的 ...

  5. Java实现币值最大化问题

    1 问题描述 给定一排n个硬币,其面值均为正整数c1,c2,-,cn,这些整数并不一定两两不同.请问如何选择硬币,使得在其原始位置互不相邻的条件下,所选硬币的总金额最大. 2 解决方案 2.1 动态规 ...

  6. java实现矩阵变换加密法

    一种Playfair密码变种加密方法如下:首先选择一个密钥单词(称为pair)(字母不重复,且都为小写字母),然后与字母表中其他字母一起填入至一个5x5的方阵中,填入方法如下: 1.首先按行填入密钥串 ...

  7. java实现第七届蓝桥杯四平方和

    四平方和 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^ ...

  8. java实现第四届蓝桥杯三部排序

    三部排序 题目描述 一般的排序有许多经典算法,如快速排序.希尔排序等. 但实际应用时,经常会或多或少有一些特殊的要求.我们没必要套用那些经典算法,可以根据实际情况建立更好的解法. 比如,对一个整型数组 ...

  9. tensorflow2.0学习笔记第一章第一节

    一.简单的神经网络实现过程 1.1张量的生成 # 创建一个张量 #tf.constant(张量内容,dtpye=数据类型(可选)) import tensorflow as tf import num ...

  10. zabbix 监控 tcp 连接数

    一.zabbix-agent 服务器配置 1.编辑zabbix_agent配置文件,添加以下内容 vim /etc/zabbix/zabbix_agentd.conf ##添加此行 UserParam ...