蓝桥杯 算法训练 ALGO-92 前缀表达式 字符操作 数学知识

算法训练 前缀表达式
时间限制: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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43302818/article/details/85088149