简单计算器

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

输入描述:

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

输出描述:

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

输入

复制
1 + 2
4 + 2 * 5 - 7 / 11
0

输出

复制
3.00
				
13.36
#include<iostream>
#include<string>
#include<stack>
#include<iomanip>
using namespace std;
char str[220];
bool ret;
int pos;
int mag[][5]
{
	1,0,0,0,0,
	1,0,0,0,0,
	1,0,0,0,0,
	1,1,1,0,0,
	1,1,1,0,0,
};
stack<int>op;
stack<double>num;
void get(int& pos, bool& ret, int& i)
{
	if (i == 0 && op.empty() == true)
	{
		ret = true;
		pos = 0;
		return;
	}
	if (str[i] == 0)
	{
		ret = true;
		pos = 0;
		return;
	}
	if (str[i] >= '0' && str[i] <= '9')
	{
		ret = false;
		pos = 0;
		for (; str[i] != ' ' && str[i] != 0; i++)
		{
			pos = pos * 10 + str[i] - '0';
		}
		if (str[i] == ' ')
			i++;
		return;
	}
	else
	{
		ret = true;
		if (str[i] == '+')
		{		
			pos = 1;
		}
		else if (str[i] == '-')
		{			
			pos = 2;			
		}
		else if (str[i] == '*')
		{			
			pos = 3;			
		}
		else if (str[i] == '/')
		{		
			pos = 4;			
		}
		i += 2;
		return;
	}
}
int main()
{
	while (cin.getline(str, 220))
	{
		if (str[0] == '0' && str[1] == 0)break;
		int pos, idx = 0; bool ret;
		while (!op.empty())op.pop();
		while (!num.empty())num.pop();
		while (true)
		{
			get(pos, ret, idx);
			if (ret == false)
				num.push((double)pos);
			else
			{ 
				double temp;
				if (op.empty() == true || mag[pos][op.top()] == 1)
					op.push(pos);
				else
				{
					while (mag[pos][op.top()] == 0)
					{
						int t = op.top();
						op.pop();
						double b = num.top();
						num.pop();
						double a = num.top();
						num.pop();
						switch (t)
						{
						case 1:temp = a + b;
							break;
						case 2:temp = a - b;
							break;
						case 3:temp = a * b;
							break;
						case 4:temp = a / b;
							break;
						default :break;
						}
						num.push(temp);
					}
					op.push(pos);
				}
			}
			if (op.size() == 2 && op.top() == 0)
				break;
		}
		cout <<fixed <<setprecision(2) << num.top() << endl;
	}
	return 0;
}


2.栈和队列一起应用
#include<iostream>
#include<stack>
#include<queue>
#include<map>
#include<string>
using namespace std;
struct node
{
	bool flag;
	char op;
	double x;
};
string s;
queue<node>q;
stack<node>opo;
map<char, int>op;
void change()
{
	node temp;
	int len = s.size();
	for (int i = 0; i < len;)
	{
		if (s[i] >= '0' && s[i] <= '9')
		{
			temp.flag = true;
			temp.x = (double)(s[i++] - '0');
			while(i<len&& s[i] >= '0' && s[i] <= '9')
				temp.x = temp.x*10+ (double)(s[i++] - '0');
			q.push(temp);
		}
		else
		{
			temp.flag = false;
			while (!opo.empty() && op[s[i]] <= op[opo.top().op])
			{
				q.push(opo.top());
				opo.pop();
			}
			temp.op = s[i];
			opo.push(temp);
			i++;
		}
	}
	while (!opo.empty())
	{
		q.push(opo.top());
		opo.pop();
	}
}
double add()
{
	double a, b;
	node cur;
	node cur1;
	while (!q.empty())
	{
		cur1 = q.front();
		q.pop();
		if (cur1.flag)
		{
			opo.push(cur1);
		}
		else
		{
			b = opo.top().x;
			opo.pop();
			a = opo.top().x;
			opo.pop();
			cur.flag = true;
			switch (cur1.op)
			{
			case'+':
				cur.x = a+b;
				break;
			case'-':
				cur.x = a - b;
				break;
			case'*':
				cur.x = a* b;
				break;
			case'/':
				cur.x = a/ b;
				break;
			default:
				break;
			}
			opo.push(cur);
		}
	}
	return opo.top().x;
}
int main()
{
	op['+'] = op['-'] = 1;
	op['*'] = op['/'] = 2;
	FILE* O;
	freopen_s(&O, "input.txt", "r", stdin);
	while (getline(cin, s),s!="0")
	{
		for(string::iterator it=s.begin();it!=s.end();it++)
		{
			if (*it ==' ')
				s.erase(it);
		}
		while (!opo.empty())opo.pop();
		change();
		printf("%.2f\n", add());
	}
	return 0;
}


全部评论

相关推荐

2025-12-08 07:42
门头沟学院 Java
27届末九,由于是女生,身边人几乎没有就业导向的,自学只能跟着网课,没人指导,很迷茫。下图是我目前的简历,不知道有需要修改的地方吗?求拷打。下面是目前的学习情况:目前算法过完了一遍力扣100和代码随想录,不过不是很熟,面经看了小林coding、JavaGuide,有一些没用过的技术看得不是很明白,掌握得不是很扎实。再加上常年跟黑马网课听思路,真正自己动手写代码的时间很少,这让我一直不敢投简历,总觉得内里空虚。项目没准备好面试相关的问题,简历上相应的考点不熟。如此种种。。。看到很多很多学长学姐大佬们的面经,愈发觉得面试可怕,自己没准备好,总担心自己是不是无望后端开发了。看到牛客很多同届以及更小一届的同学都找到实习了,很希望自己也能找到实习。而自己又好像摸不到后端学习的门路,只能不断赞叹黑马虎哥写的代码真优雅!微服务架构实在巧妙!消息队列、redis、sentinel、nacos、mybatisplus等等的引入都会让我赞叹这些工具的设计者的巧思,以及包括但不限于Java语言的优雅。然而只是停留在了解的程度,并不熟练。我是很希望能够继续深入探索这些知识的,只不过有一大部分时间都花在学校课程上了。我感觉我被困住了,我一方面必须保证我能够有个不错的学业分使我能有我几乎不想选择的读研退路(还有个原因是复习不全我会焦虑考试挂科,因此我会做好全面的准备,而这一步很费时间),一方面在B站学习各种网课,一方面得考虑提升自己并不扎实的算法基础,另一方面还得准备八股面经。这让我有点苦恼,我好像没那么多时间,因为绝大部分时间都花在了复习学校科目中了。我好像处处用时间,但收效甚微。想问问各位大佬是怎么平衡时间的呢?算法、项目和八股是怎么准备的呢?有什么高效的方法吗?谢谢您们花时间阅读我的稿件!
菜菜狗🐶:大胆投,我当时也是害怕面试,投多了发现根本约不到面🤡
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务