【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
来源:牛客网