《算法笔记》6.7小节 问题 A: 简单计算器
又是大模拟淦淦淦淦淦淦淦
思路:
这道题我居然用的队列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: 简单计算器的更多相关文章
- 算法笔记_071:SPFA算法简单介绍(Java)
目录 1 问题描述 2 解决方案 2.1 具体编码 1 问题描述 何为spfa(Shortest Path Faster Algorithm)算法? spfa算法功能:给定一个加权连通图,选取一个 ...
- 算法笔记(c++)--01背包问题
算法笔记(c++)--经典01背包问题 算法解释起来太抽象了.也不是很好理解,最好的办法就是一步步写出来. 背包问题的核心在于m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+ ...
- kNN算法笔记
kNN算法笔记 标签(空格分隔): 机器学习 kNN是什么 kNN算法是k-NearestNeighbor算法,也就是k邻近算法.是监督学习的一种.所谓监督学习就是有训练数据,训练数据有label标好 ...
- 算法笔记_023:拓扑排序(Java)
目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...
- 算法笔记_075:蓝桥杯练习 最短路(Java)
目录 1 问题描述 2 解决方案 2.1 floyd算法解决 2.2 spfa算法解决 1 问题描述 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从 ...
- tensorflow笔记:流程,概念和简单代码注释
tensorflow是google在2015年开源的深度学习框架,可以很方便的检验算法效果.这两天看了看官方的tutorial,极客学院的文档,以及综合tensorflow的源码,把自己的心得整理了一 ...
- 三维重建7:Visual SLAM算法笔记
VSLAM研究了几十年,新的东西不是很多,三维重建的VSLAM方法可以用一篇文章总结一下. 此文是一个好的视觉SLAM综述,对视觉SLAM总结比较全面,是SLAM那本书的很好的补充.介绍了基于滤波器的 ...
- 《算法笔记》之基础C/C++入门
开始进行算法笔记的学习,在此纪录下来,同时作为自己日后复习资料. 1.基本语法 #include <iostream> using namespace std; int main(){ c ...
- 算法笔记之KMP算法
本文是<算法笔记>KMP算法章节的阅读笔记,文中主要内容来源于<算法笔记>.本文主要介绍了next数组.KMP算法及其应用以及对KMP算法的优化. KMP算法主要用于解决字符串 ...
随机推荐
- Java实现 LeetCode 780 到达终点(逻辑题)
780. 到达终点 从点 (x, y) 可以转换到 (x, x+y) 或者 (x+y, y). 给定一个起点 (sx, sy) 和一个终点 (tx, ty),如果通过一系列的转换可以从起点到达终点,则 ...
- Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
问题描述 不超过19000的正整数中,与19000互质的数的个数是多少? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将 ...
- Java实现蓝桥杯VIP算法训练 自行车停放
试题 算法训练 自行车停放 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 有n辆自行车依次来到停车棚,除了第一辆自行车外,每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或 ...
- Java实现 蓝桥杯VIP 算法提高 打水问题
算法提高 打水问题 时间限制:1.0s 内存限制:512.0MB 问题描述 N个人要打水,有M个水龙头,第i个人打水所需时间为Ti,请安排一个合理的方案使得所有人的等待时间之和尽量小. 输入格式 第一 ...
- Java实现 LeetCode 101 对称二叉树
101. 对称二叉树 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2 ...
- Java实现选择排序和冒泡排序
1 问题描述 给定一个可排序的n元素序列(例如,数字.字符和字符串),将它们按照非降序方式重新排列. 2 解决方案 2.1 选择排序原理简介 选择排序开始的时候,我们从第一个元素开始扫描整个列表,找到 ...
- /etc/alternatives
如何安装一个可执行程序 一般来说我们一个可执行程序,可能在多个路径下,比如在opt路径下,或者在自己的home下. 当要达到在系统的任意路径下敲击该命令,都可执行的话,一般要将该可执行命令的路径加入到 ...
- 服务端监控工具Nmon使用方法
一.认识nmon 1.简介 nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具,它能在系统运行过程中实时地捕捉系统资源的使用情况,记录的信息比较全面, 并且能输出结果到文件中,然 ...
- Java学习之第二天
一.流程控制 1.顺序结构:自上而下,依次执行(从上到下,一直走下去) 2.选择结构:(1)if .if—else.嵌套if (2)switch(mod){ case 1:执行代码 case 2:执行 ...
- AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
pyqt5信号要定义为类属性 #!/usr/bin/python3 # -*- coding: utf-8 -*- from PyQt5.Qt import * import sys class Wi ...