[保研/考研机试] KY129 简单计算器 浙江大学复试上机题 C++实现

这篇具有很好参考价值的文章主要介绍了[保研/考研机试] KY129 简单计算器 浙江大学复试上机题 C++实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

描述

    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

输入描述:

    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

输出描述:

    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

样例输入:

输入:
1 + 2
4 + 2 * 5 - 7 / 11
0

样例输出:

输出:
3.00
13.36

思路:

①设立运算符和运算数两个栈,,一个用来存储运算符,另一个用来存储运算数。

②在运算符栈中放置一个特殊运算符#,其优先级最低。

③将表达式尾部添加一个特殊运算符$,其优先级次低。

④从左至右依次遍历字符串,若遍历到运算符,则将其与运算符栈的栈顶元素进行比较,若运算符栈的栈顶的优先级小于该运算符,则将该运算符压入运算符栈;若运算符栈的栈顶的优先级大于该运算符,则弹出该栈顶运算符,从运算数栈中依次弹出运算数,完成弹出运算符对应的运算后,再将该结果压入运算数栈。

⑤若遍历到表达式中的运算数,则直接压入运算数栈。

⑥若运算符栈中仅剩两个特殊运算符#和$,则表达式运算结束,此时运算数栈中唯一的数字就是表达式的值。

源代码:

#include<iostream>
#include<stack>
#include<map>
#include<string>
using namespace std;


//例题5.6 KY129 简单计算器
//考虑到需要计算的数字可能不止一位,就从检测到数字的索引开始,一直到检测不到数字的索引,这之间的就是一整个数字
double getNum(string str, int& index) {
	double res = 0;
	while (isdigit(str[index])) {
		res = res * 10 + str[index] - '0';
		index++;
	}
	return res;
}

//对两个数字进行运算
double cal(double x, double y, char op) {
	if (op == '+') {
		return x + y;
	}
	else if (op == '-') {
		return x - y;
	}
	else if (op == '*') {
		return x * y;
	}
	else if (op == '/') {
		return x / y;
	}
	return 0;
}

int main()
{
	//存储多个运算符号的优先级
	map<char, int> maps = { {'#',0},{'$',1},{'-',2},{'+',2}, {'/',3},{'*',3} };
	string s;
	//因为需要运算的式子可能不止一条,这里用while循环
	//因为输入的式子中可能包含多个空格,直接用getline(cin, s)回去整行的字符串,并赋值给s
	while (getline(cin, s)) {
		if (s == "0") { //结束条件
			break;
		}
		stack<char> symbol;  // 存储运算符的栈
		stack<double> number; // 存储操作数的栈
		int index = 0; //对字符串遍历的索引
		symbol.push('#'); //把'#'压入符号中,优先级最低
		s = s + '$'; //先把'$'放到要处理的公式字符串的末尾,优先级次低
		while (index < s.size()) { //遍历公式中的每一个字符
			//获取该数字索引开始的整个数字,并压入栈number中
			if (isdigit(s[index])) { 
				number.push(getNum(s, index));
			}
			//遇到公式中的空格直接跳过
			else if (s[index] == ' ') {
				index++;
			}
			else {
				//若运算符栈的栈顶的优先级小于遍历遇到的当前的运算符,则将该运算符压入运算符栈
				if (maps[s[index]] > maps[symbol.top()]) {
					symbol.push(s[index]);
					index++;
				}
				//否则,弹出该栈顶运算符,从运算数栈中依次弹出运算数,完成弹出运算符对应的运算后,再将该结果压入运算数栈。
				else {
					double x = number.top();
					number.pop();
					double y = number.top();
					number.pop();
					char op = symbol.top();
					symbol.pop();
					number.push(cal(y, x, op));
				}
			}
		}
		//精确到小数点后2位
		printf("%.2f\n", number.top());
	}

	return 0;
}

提交结果:

[保研/考研机试] KY129 简单计算器 浙江大学复试上机题 C++实现,机试刷题记录,考研,c++,算法,保研机试

 文章来源地址https://www.toymoban.com/news/detail-638404.html

到了这里,关于[保研/考研机试] KY129 简单计算器 浙江大学复试上机题 C++实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [保研/考研机试] KY180 堆栈的使用 吉林大学复试上机题 C++实现

    堆栈的使用_牛客题霸_牛客网     堆栈是一种基本的数据结构。堆栈具有两种基本操作方式,push 和 pop。其中 push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出。现在我们就来验证一下堆栈的使用。 输入描述:     对于每组测试数据,第一行是一个正整数 n(0 n = 1

    2024年02月13日
    浏览(127)
  • [保研/考研机试] KY235 进制转换2 清华大学复试上机题 C++实现

    KY235 进制转换2 https://www.nowcoder.com/questionTerminal/ae4b3c4a968745618d65b866002bbd32 将M进制的数X转换为N进制的数输出。 输入的第一行包括两个整数:M和N(2=M,N=36)。 下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。 输出X的N进制表示的数。 将M进制

    2024年02月13日
    浏览(53)
  • [保研/考研机试] KY87 鸡兔同笼 北京大学复试上机题 C++实现

    一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。 每组测试数据占1行,每行一个正整数a (a 32768) 输出包含n行,每行对应一个输入,包含两个正整数,第一个是最少的动物数

    2024年02月13日
    浏览(46)
  • [保研/考研机试] KY3 约数的个数 清华大学复试上机题 C++实现

    KY3 约数的个数 https://www.nowcoder.com/share/jump/437195121691716950188 输入n个整数,依次输出每个数的约数的个数 输入的第一行为N,即数组的个数(N=1000) 接下来的1行包括N个整数,其中每个数的范围为(1=Num=1000000000) 可能有多组输入数据,对于每组输入数据, 输出N行,其中每一行对应上

    2024年02月13日
    浏览(55)
  • [保研/考研机试] KY11 二叉树遍历 清华大学复试上机题 C++实现

    二叉树遍历_牛客题霸_牛客网 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。题目来自【牛客题霸】 https://www.nowcoder.com/share/jump/437195121692547007478 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一

    2024年02月11日
    浏览(44)
  • [保研/考研机试] KY163 素数判定 哈尔滨工业大学复试上机题 C++实现

    素数判定 https://www.nowcoder.com/share/jump/437195121691718831561 给定一个数n,要求判断其是否为素数(0,1,负数都是非素数)。 测试数据有多组,每组输入一个数n。 对于每组输入,若是素数则输出yes,否则输入no。

    2024年02月13日
    浏览(55)
  • [保研/考研机试] KY110 Prime Number 上海交通大学复试上机题 C++实现

    Prime Number https://www.nowcoder.com/share/jump/437195121691717713466 Output the k-th prime number. 输入描述: k≤10000 输出描述: The k-th prime number. 输入: 输出:

    2024年02月13日
    浏览(41)
  • [保研/考研机试] KY187 二进制数 北京邮电大学复试上机题 C++实现

    大家都知道,数据在计算机里中存储是以二进制的形式存储的。 有一天,小明学了C语言之后,他想知道一个类型为unsigned int 类型的数字,存储在计算机中的二进制串是什么样子的。 你能帮帮小明吗?并且,小明不想要二进制串中前面的没有意义的0串,即要去掉前导0。 输入

    2024年02月13日
    浏览(47)
  • [保研/考研机试] KY7 质因数的个数 清华大学复试上机题 C++实现

    求正整数N(N1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。 输入描述: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1N10^9)。 输出描述: 对于每组数据,输出N的质因数的个数。 输入: 输出: 只需要判断因数是否能够整除当前

    2024年02月13日
    浏览(47)
  • [保研/考研机试] KY30 进制转换-大整数转二进制 清华大学复试上机题 C++实现

    将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。 输入描述: 多组数据,每行为一个长度不超过30位的十进制非负整数。 (注意是10进制数字的个数可能有30个,而非30bits的整数) 输出描述: 每行输出对应的二进制数。 仍然是“除2取余法”,主要的区别在

    2024年02月13日
    浏览(86)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包