文档章节

加减乘除科学计算

能东棍
 能东棍
发布于 2017/05/17 17:22
字数 316
阅读 21
收藏 0
#include<iostream>
#include<stack>
#include <string>
#include <vector>


//判断 new_op > old_op
bool CompareOp(const std::string& new_op, const std::string& old_op)
{
	if (new_op == "+" || new_op == "-")
	{
		if (old_op == "+" || old_op == "-" || old_op == "/" || old_op == "*")
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	else
	{
		if (old_op == "/" || old_op == "*")
		{
			return false;
		}
		else
		{
			return true;
		}
	}


}

//中缀转后缀
std::vector<std::string> InfixToPostfix(const std::vector<std::string>& infix_list)
{
	std::vector<std::string> result;
	std::stack<std::string> operator_stack;

	for (const auto& input : infix_list)
	{	
		if (input == "+" || input == "-" || input == "*" || input == "/")
		{
			while (true)
			{
				if (operator_stack.empty())
				{
					operator_stack.push(input);
					break;
				}
				else
				{	
					//比较当前运算符和栈顶的运算符的优先级,栈顶优先级大于等于当前的运算符时,写入结果中
					const auto& top_operator = operator_stack.top();
					if (CompareOp(input, top_operator))
					{
						operator_stack.push(input);
						break;
					}
					else
					{
						result.push_back(top_operator);
						operator_stack.pop();
					}
				}
			}
		}
		else
		{
			//数字直接写入结果中
			result.push_back(input);
		}
	}

	while (!operator_stack.empty())
	{
		result.push_back(operator_stack.top());
		operator_stack.pop();
	}
	
	return std::move(result);
}


//计算后缀表达式的结果
float CalcPostFix(std::vector<std::string> infix_list)
{
	std::stack<float> number_stack;
	for (auto input : infix_list)
	{
		if (input == "+" || input == "-" || input == "*" || input == "/")
		{	
			//遇到运算符, 弹出栈顶的两个数字进行计算,并把计算结果入栈
			//注意顺序,先弹出的应该是是右边的数字
			auto num2 = number_stack.top();
			number_stack.pop();

			auto num1 = number_stack.top();
			number_stack.pop();

			if (input == "+")
			{
				number_stack.push(num1+num2);
			}
			else if (input == "-")
			{
				number_stack.push(num1 - num2);
			}
			else if (input == "*")
			{
				number_stack.push(num1 * num2);
			}
			else if (input == "/")
			{
				number_stack.push(num1/num2);
			}
		}
		else
		{
			//数字直接入栈
			char* end;
			number_stack.push(std::strtof(input.c_str(), &end));
		}
	}

	return std::move(number_stack.top());
}

int main()
{
	const std::vector<std::string>  infix_list = { "4.2", "*", "5", "-", "6", "*", "2"};
	auto result = InfixToPostfix(infix_list);
	std::cout << CalcPostFix(result) << '\n';
	return 0;
}

© 著作权归作者所有

共有 人打赏支持
上一篇: 排序算法练习
下一篇: CMAKE使用总结
能东棍
粉丝 7
博文 34
码字总数 25265
作品 0
南京
程序员
私信 提问
我来阅读lodash源码——Math(一)

## 源码注释版 这一组函数都是数学计算相关的,主要分为三类: 加减乘除:、、、 求最大最小平均值:、、、、、、、 小数的四舍五入:、、 加减乘除 在加减乘除的源码中可以看到这四个函数都...

axuebin
2017/11/27
0
0
我来阅读lodash源码——Math(一)

源码注释版 这一组函数都是数学计算相关的,主要分为三类: 加减乘除:、、、 求最大最小平均值:、、、、、、、 小数的四舍五入:、、 加减乘除 在加减乘除的源码中可以看到这四个函数都引用...

axuebin
2017/11/28
0
0
Java中的陷阱题

1、找奇数: public static boolean isOdd(int i){return i % 2 == 1;}上面的方法真的能找到所有的奇数么? A:没有考虑到负数问题,如果i为负则不正确。应该return i%2 == 0 2. 浮点数相减 ...

Hosee
2016/02/17
568
0
python 函数的封装

python 函数的封装 假设 使用python编写一独立加减乘除运算代码(不想让人家看到我的计算过程) 而另外使用python封装一个exe程序 调用该加减乘除代码的运算结果 该加减成除代码应如何封装 ...

代码堆里睡觉的人
2013/01/07
320
1
计算加减乘除【果果老师】

公众号:果果老师 大家好,我是果果老师 今天的少儿编程课的内容为:计算加减乘除 视频课程 计算加减乘除【果果老师】_腾讯视频 https://v.qq.com/x/cover/h0533h2t838/h0533h2t838.html 该课...

果果老师
2017/08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
32分钟前
2
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
57分钟前
6
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
6
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
5
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部