利用栈实现计算器(calculator)二:十进制数字的加减乘除

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 < size; i++)
		res += (str[i] - '0')*pow(10, size-i-1);
	return res;
}

2.3 计算后缀算术表达式

如同上一篇文章所讲的,遍历表达式,如果是数字则入栈,如果是运算符,那么取栈顶两个元素(栈顶和次栈顶)做运算符的运算,栈顶两元素出栈,运算结果入栈。最后,栈顶的元素即为运算结果。注意加法和乘法对运算数的前后没有要求,而减法和除法对运算数的前后有要求。根据后缀表达式的构建原则,如中缀表达式a-b改写为后缀表达式 ab-,又后缀表达式从左到右入栈,所以b在栈顶 a在其下。令栈顶元素为被减数或被除数,次栈顶元素为减数和除数。

int computeSuffix(vector str)
{
	int size = str.size();
	stack st;
	for (int i = 0; i < size; i++)
	{
		if (str[i] != "+"&&str[i] != "-"&&str[i] != "*"&&str[i] != "/")
			st.push(str2dec(str[i]));
		if (str[i] == "+")
		{
			int a = st.top();
			st.pop();
			int b = st.top();
			st.pop();
			st.push(a + b);
		}
		if (str[i] == "-")
		{
			int a = st.top();
			st.pop();
			int b = st.top();
			st.pop();
			st.push(b - a);
		}
		if (str[i] == "*")
		{
			int a = st.top();
			st.pop();
			int b = st.top();
			st.pop();
			st.push(a * b);
		}
		if (str[i] == "/")
		{
			int a = st.top();
			st.pop();
			int b = st.top();
			st.pop();
			st.push(b / a);
		}
	}
	return st.top();
}

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 = { "10","11","21","12","-","5","*","+","44","+","*" };
	//str=10*(11+(21-12)*5+44)=1000
	cout << computeSuffix(str) << endl;
	return 0;
}

你可能感兴趣的:(数据结构与算法)