Calculator(1.5)

Github链接

ps.负数的处理未完成

解题过程中遇到的困难和解决

  1. <stack>的使用:

    认真研究了栈,基本上掌握了用法,与<queue>的区别就是队列中可以直接访问首元素而栈并不能。(debug过程让我深深体会到了使用s.pop()时一定要确认是否为空栈!!!!!)
  2. <sstream>的使用

    <sstream>用起来比较简单,网上查了资料就可以用了,注意点就是多次转化时要记得stream.clear,不然容易出错。
  3. 后缀表达式的转化及运算

    这次作业主要就是让我们理解前中后缀表达式吧...找到了一篇比较好理解的教程,总的过程比较长顺利,满足以下四个原则,照猫画虎地就转化了后缀表达式。

    转化原则

    • 当读到一个操作数时,立即将它放到输出中。操作符则不立即输出,放入栈中。遇到左圆括号也推入栈中。
    • 如果遇到一个右括号,那么就将栈元素弹出,将符号写出直到遇到一个对应的左括号。但是这个左括号只被弹出,并不输出。
    • 在读到操作符时,如果此时栈顶操作符优先性大于或等于此操作符,弹出栈顶操作符直到发现优先级更低的元素位置。除了处理')'的时候,否则决不从栈中移走'('。操作符中,'+' '-'优先级最低,'(' ')'优先级最高。
    • 如果读到输入的末尾,将栈元素弹出直到该栈变成空栈,将符号写到输出中。
  4. 命令行的使用

    依旧是找!资!料!掌握了新技能,开心。

一点感想

看到题目我就懵逼了,加上拖延症晚期,4.13才开始动手...总算把大部分写完了,还有个负数的情况还没搞定,过两天再填坑吧。感觉还是挺有成就感的,希望自己以后能勤快点吧...

附上代码

Calculation.cpp

#include "Calculation.h"

Calculation::Calculation()
{ } /*将Scan中的字符串传入*/
void Calculation::GetQueue(queue<string>tmp)
{
Q = tmp;
} /*后缀转化是判断是否为括号*/
bool isBr(string c)
{
if(c == "(" || c == ")")
return 1;
else
return 0;
} /*确定运算符的优先级*/
int getPri(string c)
{
if(c == "+" || c == "-")
return 1;
else if(c == "*" || c == "/")
return 2;
else if(c == "(" || c == ")")
return 0; /*将括号的优先级设为最低防止误操作*/
} /*根据运算符进行计算*/
double Cal(char c , double a , double b)
{
switch(c)
{
case'+':return(a + b);break;
case'-':return(a - b);break;
case'*':return(a * b);break;
case'/':return(a / b);break;
}
} /*后缀转化*/
void Calculation::Change(queue<string>Q)
{
while(Q.size() != 0)
{
string c;
c = Q.front(); /*处理运算符*/
if(c == "+" || c == "-" || c == "*" || c == "/" || c == "(" || c == ")")
{ /*传入括号时*/
if(isBr(c))
{
/*左括号不做处理*/
if(c == "(")
{
sym.push(c);
}
else
{
/*发现右括号时将栈顶元素弹出知道左括号,删除左括号*/
while(sym.top() != "(")
{
get.push(sym.top());
sym.pop();
}
sym.pop();
}
}
/*传入其他运算符时*/
else
{
/*根据运算符优先级进行弹出或传入*/
while(sym.size() != 0 && getPri(c) <= getPri(sym.top()))
{
get.push(sym.top());
sym.pop();
}
sym.push(c);
}
}
/*数字直接传入*/
else
{
get.push(c);
}
Q.pop();
} /*Q为空栈时,将sym栈内所有运算符弹出*/
while(sym.size() != 0)
{
get.push(sym.top());
sym.pop();
}
} /*计算过程*/
void Calculation::Ans()
{
std::stringstream stream;
double tmp;
double a;
stack<double>ans; /*存储运算值*/ /*从队首元素开始进行计算*/
while(get.size() != 0)
{
/*遇到数字直接转化为double类型入栈*/
if(get.front()[0] >= '0' && get.front()[0] <= '9')
{
stream.clear();
stream << get.front();
stream >> tmp;
ans.push(tmp);
get.pop();
}
/*遇到运算符取出栈内两个数字进行运算后再入栈*/
else
{
tmp = ans.top();
ans.pop();
a = Cal(get.front()[0] , ans.top() , tmp); /*Cal函数进行具体计算*/
ans.pop();
ans.push(a);
get.pop();
}
}
cout << ans.top() << endl; /*输出结果*/
}

Calculator(1.5)的更多相关文章

  1. [LeetCode] Basic Calculator II 基本计算器之二

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  2. [LeetCode] Basic Calculator 基本计算器

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  3. Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  4. Windows Universal 应用 – Tip Calculator

    声明 以下内容取材于 Bob Tabor 的课程<Windows Phone 8.1 Development for Absolute Beginners>,链接地址为:http://ww ...

  5. Calculator(1.0)

    Calculator(1.0) Github链接 解题过程中遇到的困难 对于c++中类和对象的使用不够明确,看了c++的视频教程学会了用类和对象来写程序. 不会使用<queue>,在网上查 ...

  6. 数据结构与算法(1)支线任务2——Basic Calculator

    题目:https://leetcode.com/problems/basic-calculator/ Implement a basic calculator to evaluate a simple ...

  7. calculator

    #include <stdio.h> #include <stdlib.h> typedef enum { FALSE = , TRUE }BOOL; void calcula ...

  8. Basic Calculator

    本博客介绍leetcode上的一道不难,但是比较经典的算法题. 题目如下: Implement a basic calculator to evaluate a simple expression s ...

  9. Matrix Calculator

    表达式分析+矩阵+计算器+寄存器=矩阵计算器 怎么想起来搞这个呢.. //刚看龙书兴致勃勃要搞表达式分析 这个寄存器比较简陋,26字母+4缓存,//字母不分大小写 当然,不只能算矩阵,还能算数= = ...

随机推荐

  1. Kanzi Q&A

    Q:为什么我的kanzi studio安装完后无法编译apk? A:请安装jdk,并设置环境变量,并更新thirdpartsdk. Q:为什么使用路径无法读取到列表listbox内的列表项? A:列表 ...

  2. js设计模式总结-策略模式

    策略模式 要解决的问题 当解决一个问题有多种方法时,选择使用哪种方法时就少不了要用大量的if语句进行判断,如果将这些方法的实现和判断语句放在一起实现就会产生问题, 比如增加一种的新的方法时,就不得不再 ...

  3. Latex图片显示问题(1)

    用latex编译后,若用dvipdf生成pdf文件,则其中有个eps图的左侧会显示不完全:若是用dvips--pspdf生成pdf文件,图像显示没问题. 这种情况的问题出在,加载 graphicx 宏 ...

  4. 水平垂直居中div(css3)

    一.在需要居中的元素加上如下C3属性即可: <!doctype html><html lang="en"><head> <meta cha ...

  5. 月薪3万的程序员告诉你:这样工作才能拿高薪(转 IT之家)

    习惯即刻回报 他不懂得只有春天播种,秋天才会有收获.刚刚付出一点点,甚至还没有付出,就想要得到回报.技术刚刚掌握,能一边百度一边干活了就觉得该拿到多少多少钱了.找工作先想着多少多少钱,入职了没干几个月 ...

  6. Openfire Strophe开发中文乱码问题

    网站上有很多Openfire Web方案,之前想用Smack 但是jar包支持客户端版本的,还有JDK版本问题  一直没调试成功  估计成功的方法只能拜读源码进行修改了. SparkWeb 官网代码很 ...

  7. goroutine

    Go语言从诞生到普及已经三年了,先行者大都是Web开发的背景,也有了一些普及型的书籍,可系统开发背景的人在学习这些书籍的时候,总有语焉不详的感觉,网上也有若干流传甚广的文章,可其中或多或少总有些与事实 ...

  8. go并发

    Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据. 以下是我入门的学习笔记. 首先,并行!=并发, 两者是不同的,可 ...

  9. [WPF]DataGridHyperlinkColumn网址过长TextTrimming无效

    <DataGridHyperlinkColumn Binding="{Binding source}" Header="来源"> <DataG ...

  10. VPN安装后报错:Reason442 & Error56

    VPN安装后一直报错,同样的32位安装包别人安装是正常,自己安装就不正常了,考虑到是自己电脑配置的问题. 经过一番努力,解决了问题,下面就本次解决过程做一个小小的总结. (1)确保VPN Servic ...