欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Emacs计算器】c++

程序员文章站 2022-05-14 18:42:27
...

题目描述:

Emacs号称神的编辑器,它自带了一个计算器。与其他计算器不同,它是基于后缀表达式的,即运算符在操作数的后面。例如“2 3 +”等价于中缀表达式的“2 + 3”。
请你实现一个后缀表达式的计算器。

输入描述:

输入包含多组数据。
每组数据包括两行:第一行是一个正整数n (3≤n≤50);紧接着第二行包含n个由数值和运算符组成的列表。
“±*/”分别为加减乘除四则运算,其中除法为整除,即“5/3=1”。

输出描述:

对应每一组数据,输出它们的运算结果。

解题思路:

1、当输入的字符串为数字字符串的时候将其转化为数字并放进栈里面;为运算符号的时候从栈里弹出两个数据进行运算,并将结果又放回栈里;
2、如何判断输入的是数字还是运算符号?
判断字符串第一个位置字符是否>=‘0’且<=‘9’,若是则其为数字类型字符串,否则为运算符号
3、怎么把字符串转化为整形数据?
利用int atio(const char ptr)将数字类型的字符串转换成整形数据;它包含在stdlib.h头文件中;
这里的参数类型是char
所以这里要将string转化为c类型的string,在进行转化

注:

1、输入的数据不仅仅是0~9,还可以是两位、三位……等数据,故这里要以字符串形式输入;(要注意审题)
2、注意代码的精简,不要冗余

原先代码:

#include<iostream>
#include<stack>
using namespace std;
int main()
{
	int num;
	while (cin >> num)
	{
		if ((num<3) || (num>50))
		{
			return 0;
		}
		stack<int>numcup;
		int num1 = 0;
		int num2 = 0;
		char res;
		for (int i = 0; i < num; i++)
		{
			cin >> res;
			if ((res >= '0') && (res <= '9'))
			{
				numcup.push((res-'0'));
			}
			else if ((numcup.size()==1)&&( res == '+'))
			{
				num1 = numcup.top();
				numcup.pop();
				num2 = numcup.top();
				numcup.pop();
				num2= num2  + num1;
				numcup.push(num2);
			}
			else if ((numcup.size() == 1) && (res == '-'))
			{
				num1 = numcup.top();
				numcup.pop();
				num2 = numcup.top();
				numcup.pop();
				num2 = num2 - num1;
				numcup.push(num2);
			}
			else if ((numcup.size() == 1) && (res == '*'))
			{
				num1 = numcup.top();
				numcup.pop();
				num2 = numcup.top();
				numcup.pop();
				num2 = num2 * num1;
				numcup.push(num2);
			}
			else if ((numcup.size() == 1) && (res == '/'))
			{
				num1 = numcup.top();
				numcup.pop();
				num2 = numcup.top();
				numcup.pop();
				if (num1 == 0)
				{
					return 0;
				}
				num2 = num2 / num1;
				numcup.push(num2);
			}
		}
		cout << numcup.top() << endl;
		system("pause");
	}
	return 0;
}

修改后代码:

#include<iostream>
#include<stack>
#include<string>
#include<cstdlib>
using namespace std;
int main()
{
	int num;
	while (cin >> num)
	{
		if ((num<3) || (num>50))
		{
			return 0;
		}
		stack<int>numcup;
		int num1 = 0;
		int num2 = 0;
		string res;
		for (int i = 0; i<num; i++)
		{
			cin >> res;
			if ((res[0]>='0') && (res[0] <= '9'))
			{
				numcup.push(atoi(res.c_str()));
				//atoi函数包含在stdlib.h中,将一个字符串(数字类型的)转为数字
				//int atio(const char *nptr)
				//参数类型是char*所以这里要将string转化为c类型的string
			}
			else
			{
				num1 = numcup.top();
				numcup.pop();
				num2 = numcup.top();
				numcup.pop();
				if (res == "+")
				{
					num2 = num2 + num1;
					numcup.push(num2);
				}
				else if (res == "-")
				{
					num2 = num2 - num1;
					numcup.push(num2);
				}
				else if (res == "*")
				{
					num2 = num2 * num1;
					numcup.push(num2);
				}
				else if (res == "/")
				{
					num2 = num2 / num1;
					numcup.push(num2);
				}
			}
		}
		cout << numcup.top() << endl;
		system("pause");
	}
	return 0;
}

链接:https://www.nowcoder.com/questionTerminal/1a92fbc771a54feb9eb5bd9b3ff2d0a9
来源:牛客网

相关标签: 日常练习