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

本文介绍了一种算法,用于解析并计算前缀表达式的值。通过字符串输入前缀表达式,利用C++的迭代器和switch-case结构,分别实现了加、减、乘、除四种基本运算。该算法首先解析字符串,提取运算符和操作数,然后执行相应的运算。

算法训练 前缀表达式
时间限制: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;
}
### 子字符串处理方法及其应用 #### R语言中的子字符串检测 在R语言中,`grepl()` 函数被广泛应用于检查一个字符串是否包含特定的子字符串。此函数返回逻辑向量,指示模式(即要查找的子字符串)是否存在于给定字符向量的各个元素中[^1]。 ```r # 定义测试字符串 test_string <- "这是一个用于测试的字符串" # 使用 grepl() 查找子字符串是否存在 result <- grepl("测试", test_string) print(result) # 输出 TRUE 或 FALSE 表明是否找到匹配项 ``` #### Python中提取指定位置的子字符串 Python 提供了灵活的方式通过切片操作来获取位于两个特定分隔符之间的子字符串。对于复杂情况下的子字符串提取,可以利用正则表达式的强大能力来进行精确控制[^2]。 ```python import re def extract_substring(s): pattern = r"(?<=-).+?(?=-(.*?-))" # 正则表达式定义:寻找第一个和第三个短横线间的部分 match = re.search(pattern, s) if match: return match.group(0) else: return None original_str = "--前缀--中间部分--后缀" extracted_part = extract_substring(original_str) if extracted_part is not None: print(f'Extracted substring: "{extracted_part}"') else: print('No matching substring found.') ``` #### C++ 中使用 Boost 库进行字符串处理 Boost.String_Algo一个专门针对字符串算法设计的部分,在这里可以通过调用 `find_nth_occurrence` 来定位多个出现的位置并据此完成所需的切割工作;另外还有诸如 `erase_all_copy`, `replace_first_copy` 等实用的功能可以帮助开发者快速有效地执行各种复杂的字符串变换任务[^3]。 ```cpp #include <boost/algorithm/string.hpp> #include <iostream> int main(){ std::string str = "example-string-to-process"; size_t pos1 = boost::algorithm::nth_find(str.begin(), str.end(), "-", 1); size_t pos3 = boost::algorithm::nth_find(str.begin(), str.end(), "-", 3); // 假设pos1 和 pos3 都能找到,则继续下面的操作... if (pos1 != std::string::npos && pos3 != std::string::npos){ std::string result = str.substr(pos1 + 1, pos3 - pos1 - 1); std::cout << "Substring between first and third dash:" << result; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值