算法训练 前缀表达式
时间限制:1.0s 内存限制:512.0MB
提交此题
问题描述
编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值。输入格式为:“运算符 对象1 对象2”,其中,运算符为“+”(加法)、“-”(减法)、“*”(乘法)或“/”(除法),运算对象为不超过10的整数,它们之间用一个空格隔开。要求:对于加、减、乘、除这四种运算,分别设计相应的函数来实现。
输入格式:输入只有一行,即一个前缀表达式字符串。
输出格式:输出相应的计算结果(如果是除法,直接采用c语言的“/”运算符,结果为整数)。
输入输出样例
样例输入
5 2
样例输出
7
分析:其实这个题是很简单的,把运算符和两个对象分别用char和int存储的话,简单的不得了。而且我觉得这样做提交答案它也不会算你错。但我觉得既然题要求用字符串去存储了,就按要求来做,偷懒是不会得到锻炼的。
思路:首先对字符串进行分析,将运算符,两个对象分别提取出来,然后进行相应的加减乘除运算。
#include <iostream>
#include <cstring>
using namespace std;
//读一个数,直到下一个空格为止,同时使迭代器下移到下一个数的首地址
void fun(string::iterator &it, int &num)
{
while(*it != ' ')
{
num *= 10;
num += *it - '0';
it++;
}
it++;
}
int sum(string s)
{
int a, b;
string::iterator it = s.begin();
fun(it, a); //使迭代器指向第一个数
a = 0;
fun(it, a); //读第一个数的值
b = 0;
fun(it, b); //读第二个数的值
return a + b;
}
int jian(string s)
{
int a, b;
string::iterator it = s.begin();
fun(it, a); //使迭代器指向第一个数
a = 0;
fun(it, a); //读第一个数的值
b = 0;
fun(it, b); //读第二个数的值
return a - b;
}
int cheng(string s)
{
int a, b;
string::iterator it = s.begin();
fun(it, a); //使迭代器指向第一个数
a = 0;
fun(it, a); //读第一个数的值
b = 0;
fun(it, b); //读第二个数的值
return a * b;
}
int chu(string s)
{
int a, b;
string::iterator it = s.begin();
fun(it, a); //使迭代器指向第一个数
a = 0;
fun(it, a); //读第一个数的值
b = 0;
fun(it, b); //读第二个数的值
return a / b;
}
int main()
{
string s;
getline(cin, s);
s.push_back(' ');
switch(s[0])
{
case '+':
cout << sum(s) << endl;
break;
case '-':
cout << jian(s) << endl;
break;
case '*':
cout << cheng(s) << endl;
break;
case '/':
cout << chu(s) << endl;
break;
default:
break;
}
return 0;
}