《算法笔记》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算法主要用于解决字符串 ...
随机推荐
- ASP.NET使用HttpHandler进行页面静态化(自动生成页面)
这次的Demo是,一个根页面,点击链接创建子页面,子页面都是一个Template页面进行替换的 一个根页面 <%@ Page Language="C#" AutoEventW ...
- Java实现 LeetCode 419 甲板上的战舰
419. 甲板上的战舰 给定一个二维的甲板, 请计算其中有多少艘战舰. 战舰用 'X'表示,空位用 '.'表示. 你需要遵守以下规则: 给你一个有效的甲板,仅由战舰或者空位组成. 战舰只能水平或者垂直 ...
- Java实现LeetCode_0026_RemoveDuplicatesFromSortedArray
package javaLeetCode.primary; public class RemoveDuplicatesFromSortedArray_26 { public static void m ...
- python—socket编程
一:客户端/服务器 架构 1.硬件C/S架构:(例如,打印机) 2.软件C/S架构:互联网中处处是C/S架构 腾讯作为服务端为你提供视频,你得下个腾讯视频客户端才能看它的视频 C/S架构与socket ...
- mysql基础之-mysql数据控制语言DCL(七)
0x01 mysql中的权限分布 mysql中的用户信息都存储在系统数据库mysql的user表中 查询语句:select host,user,password from mysql.user; 创建 ...
- javafx分别设置四个边框
package border; import javafx.application.Application; import javafx.geometry.Insets; import javafx. ...
- [TopCoder]Seatfriends
题目 点这里看题目. 分析 可以想到用 DP 解决. 由于把空位放到状态里面太麻烦了,因此我们单独将 " 组 " 提出来进行 DP . \(f(i,j)\):前\( ...
- Windows安装多个python解释器
Windows安装多个python解释器 在windows10系统下安装两个不同版本的的python解释器,在通常情况下编译执行文件都是没问题的,但是加载或下载包的时候pip的使用就会出现问题,无 ...
- IDEA优化内存配置,可提高启动和运行速度
找到IDEA安装的bin目录 打开idea.exe.vmoptions 文件 关键的三个参数的说明 1. -Xms 是最小启动内存参数 2. -Xmx 是最大运行内存参数 3.-XX:Reserved ...
- 基于flask框架的高校舆情分析系统
系统分析: 高校舆情分析拟实现如下功能,采集微博.贴吧.学校官网的舆情信息,对这些舆情进行数据分析.情感分析,提取关键词,生成词云分析,情感分析图,实时监测舆情动态. 系统设计: 前端:采用layui ...