1.简述
上一篇文章里将科学计算器的实现分为了两部分:1.中缀算术表达式改写为后缀算术表达式 2.计算后缀算术表达式
并且给出了个位数的加减乘基本的实现。这一篇将利用牛客网的编程题目,给出后缀运算表达式对于十进制数字(可以多于一位)的加减乘除(整形除法)运算。
题目:[编程题]Emacs计算器 https://www.nowcoder.com/questionTerminal/1a92fbc771a54feb9eb5bd9b3ff2d0a9?toCommentId=3049917
github:https://github.com/AnkangH/CSDN/blob/master/%E5%88%A9%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E8%AE%A1%E7%AE%97%E5%99%A8/02.%E8%AE%A1%E7%AE%97%E5%90%8E%E7%BC%80%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E5%80%BC.cpp
2.实现
2.1 获取输入
输入的格式为以空格区分的字符串 如 111 21 *并且数目已知。因为每个字符串之间有空格区分。可以很好的满足cin>>string,因此使用vector保存一个完整的后缀算术表达式,其中的每个元素为操作数或是运算符,不包含空格。
2.2 输入的分类
输入有两种,操作数和运算符。对于操作数,需要将string转换为int,使用库函数或者自己写均可。如“103”,size=2,int=1*10^2+0*10^1+3*10^0=sum(str[i]*pow(10,size-1-i)),i=0,1,...,size-1。对于运算符,要注意,即便只有一个字符, 也是字符串而不是字符。“a”是字符串,而不是‘a’。字符串不可赋值字符,不可与字符比较。
int str2dec(string str)
{int size = str.size();int res = 0;for (int i = 0; i }
2.3 计算后缀算术表达式
如同上一篇文章所讲的,遍历表达式,如果是数字则入栈,如果是运算符,那么取栈顶两个元素(栈顶和次栈顶)做运算符的运算,栈顶两元素出栈,运算结果入栈。最后,栈顶的元素即为运算结果。注意加法和乘法对运算数的前后没有要求,而减法和除法对运算数的前后有要求。根据后缀表达式的构建原则,如中缀表达式a-b改写为后缀表达式 ab-,又后缀表达式从左到右入栈,所以b在栈顶 a在其下。令栈顶元素为被减数或被除数,次栈顶元素为减数和除数。
int computeSuffix(vector str)
{int size = str.size();stack st;for (int i = 0; i }
2.4测试
#include //for cout endl
#include //for stack
#include// for string
#include//for vector
#include //for pow()
using namespace std;
string mid2back(string);//中缀计算表达式转后缀计算表达式
int compute(string);//计算后缀表达式
int computeSuffix(vector);//计算后缀表达式 int整数多于1位 + - * /
bool priority(char a, char b);//辅助函数 判断两个运算符的优先级
int str2dec(string);
int main()
{vector str &#61; { "10","11","21","12","-","5","*","&#43;","44","&#43;","*" };//str&#61;10*(11&#43;(21-12)*5&#43;44)&#61;1000cout <}