华为机试题(仿LISP字符串运算) C++实现_lisp语言唯一的语法就是括号要配对_LEOdabao的博客-程序员秘密

题目描述 
LISP语言唯一的语法就是括号要配对。 
形如 (OP P1 P2 …),括号内元素由单个空格分割。 
其中第一个元素OP为操作符,后续元素均为其参数,参数个数取决于操作符类型 
注意:参数 P1, P2 也有可能是另外一个嵌套的 (OP P1 P2 …) 
当前OP类型为add/sub/mul/div(全小写),分别代表整数的加减乘除法。简单起见,所以OP参数个数为2 
举例 
-输入:(mul 3 -7)输出:-21 
输入:(add 1 2) 输出:3 
输入:(sub (mul 2 4) (div 9 3)) 输出 :5 
输入:(div 1 0) 输出:error 

主要思路:对输入的字符串进行预处理,拆分成'('、')'、操作数和操作符("add", "sub", "mul", "div"),随后使用堆栈处理这些拆分后的字符串。编译器为VS(注:若使用gcc编译器,pch = strtok_s(str, splitChar, &p);需要改为pch = strtok(str, splitChar);)代码如下:

#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

void reGenerateString(const string &Oldstr, string &newStr)
{
	string str(Oldstr);
	for (auto a : str)
	{
		if (a == '(' || a == ')')
		{
			newStr = newStr + " " + a + " ";
		}
		else
		{
			newStr += a;
		}
	}
}

void split(char *str, char *splitChar, vector<string> &strvec)
{
	char * pch;
	char * p;
	pch = strtok_s(str, splitChar, &p);
	while (pch != NULL)
	{
		//printf("%s\n", pch);
		strvec.push_back(string(pch));
		pch = strtok_s(NULL, " ", &p);
	}
}

void str2Char(const string& str, char *pstr)
{
	if (pstr == NULL)
		return;
	int i = 0, length = str.length();
	for (; i < length; ++i)
		pstr[i] = str[i];
	pstr[i] = '\0';
}

int main()
{
	string input, newInput;
	while (getline(cin, input))
	{
		newInput.clear();
		reGenerateString(input, newInput);

		//cout << newInput << endl;
		stack<string> cmdStack;
		vector<string> strCmdVector;
		//按空格分开split
		char chCmd[1024];
		str2Char(newInput, chCmd);
		split(chCmd, " ", strCmdVector);
		bool flag = true;

		for (auto a : strCmdVector)
		{
			if (a != ")") //遇到')'开始弹栈,找到匹配的'(',匹配的括号内是完整的一个运算式
				cmdStack.push(a);
			else
			{
				vector<string> operAndNum;
				while (cmdStack.top() != "(")
				{
					operAndNum.push_back(cmdStack.top());
					cmdStack.pop();
				}
				cmdStack.pop();
				//operAndNum = {"-7", "3", "mul"};
				if (operAndNum[2] == "add")
					cmdStack.push(to_string(atoi(operAndNum[1].c_str()) + atoi(operAndNum[0].c_str())));
				else if (operAndNum[2] == "sub")
					cmdStack.push(to_string(atoi(operAndNum[1].c_str()) - atoi(operAndNum[0].c_str())));
				else if (operAndNum[2] == "mul")
					cmdStack.push(to_string(atoi(operAndNum[1].c_str()) * atoi(operAndNum[0].c_str())));
				else if (operAndNum[2] == "div")
				{
					if (atoi(operAndNum[0].c_str()) == 0)
					{
						flag = false;
						break;
					}
					cmdStack.push(to_string(atoi(operAndNum[1].c_str()) / atoi(operAndNum[0].c_str())));
				}
			}
		}
		if (flag == false)
			cout << "error" << endl;
		else
			cout << cmdStack.top() << endl;
	}
	return 0;
}

再次声明:

在gcc下编译(或OJ)时,

pch = strtok_s(str, splitChar, &p);

需要改为

pch = strtok(str, splitChar);

此外还需要引入strtok的头文件

#include <string.h>

谢谢大家!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LEOdabao/article/details/81637277

智能推荐

LinkedHashMap特性与HashMap排序_linkedhashmap 排序_lingchen336的博客-程序员秘密

HashMap:新key的加入或旧key的value的改变会刷新map中key的位置,变化的key总是存储在最前面。LinkedHashMap:有序的HashMap,key的改变不会影响key在map中的位置。如下一道DB面试题:/**@author [email protected] 2021/7/5数字去重:输入一组数字,按数字出现的次数排序,次数多的排在最前面,次数相同按出现顺序排序。使用LinkedHashMap 有序map, map排序输入123,56,123,89输出123,56,89

POJ 百炼 保研机试 2976:All in All_冰竹依梦的博客-程序员秘密

2976:All in All查看提交统计提示提问总时间限制: 1000ms 内存限制: 65536kB描述给定两个字符串s和t,请判断s是否是t的子序列。即从t中删除一些字符,将剩余的字符连接起来,即可获得s。输入包括若干个测试数据。每个测试数据由两个ASCII码的数字和字母串s和t组成,s和t的长度不超过100000。输出对每个测试数据,如果

vue导入静态js_vue引入静态js文件的方法_weixin_39786617的博客-程序员秘密

由于一些演示,需要对编码名称等可快速进行修改,需要页面方便配置。由于build后的vue项目基本已经看不出原样,因此需要创建一个文件,并在打包的时候不会进行编译。vue-cli 2.0的作法是在static文件下创建js。vue-cli 3.0 的写法则是直接在public文件夹下创建js、具体操作如下:1、在public文件夹下创建config.js文件,里面文件的语法是es5,不允许使用浏览器...

如何写SysV服务管理脚本_普通网友的博客-程序员秘密

本文目录:1.1 SysV脚本的特性1.2 SysV脚本要具备的能力1.3 start函数分析1.4 stop函数分析1.5 reload函数分析1.6 status、restart、force-reload等1.7 结束语 SysV服务管理脚本和/etc/rc.d/init.d/functions文件中的几个重要函数(包括daemon,killproc,statu

Handling Complexity in the Halo 2 AI_wolf96的博客-程序员秘密

原文:http://www.gamasutra.com/view/feature/130663/gdc_2005_proceeding_handling_.phpDevelopers of game AI are always interested in cramming more complexity into the virtual brains they build. However

React使用axios的坑:每次都要请求两次,而且前后端相同配置_react前端请求后台接口时数据总是第二次请求时才返回数据_易函123的博客-程序员秘密

React使用axios的坑:每次都要请求两次,而且前后端相同配置项目:react-antd-axios接口会调用两次,但是页面中并没有写调用两次的方法,componentDidMount中值调用了一次,反复查看没有问题,axios中封装的api也没有出现问题。我的项目解决:在包裹着content的路由页面,也就是主页面中componentDidMount写了方法,但是并没有调用api...

随便推点

OpenCV图像处理算法——2(《Local Color Correction 》论文阅读及C++复现)_Delv_Peter的博客-程序员秘密

Local Color Correction(局部颜色校正)以下大部分引用自:https://www.yanxishe.com/columnDetail/16833前言这个是出自一篇论文里面的算法。论文地址为:http://www.ipol.im/pub/art/2011/gl_lcc/ 。IPOL 是一个非常好的学习数字图像处理的网站,上面的论文都是提供配套源码的,如果平时在数字图像处...

数据库(MySQL)面经汇总_数据库面经_青竹恶鬼的博客-程序员秘密

转载链接,方便复习,侵删!1.关系型和非关系型数据库的区别(各自优点)2.常用SQL语句(DDL,DML,DCL,TCL)3.数据库中join的类型与区别(inner join, outer join, cross join, natural join, self join),注意适用场景和sql语句的编写4. 数据库的索引类型5.聚集索引和非聚集索引的区别(叶节点存储内容)6.唯一性索引和主码索引的区别7.索引的优缺点,什么时候使用索引,什么时候不能使用索引(重点)8.索引的底层实现(B+

简述文本属性Attributes的用法_diuganqi7521的博客-程序员秘密

文本属性Attributes1.NSKernAttributeName: @10 调整字句 kerning 字句调整2.NSFontAttributeName : [UIFont systemFontOfSize:_fontSize] 设置字体3.NSForegroundColorAttributeName :[UIColor redColor] 设置文字颜色4.NS...

Non-local U-Nets_这就是算法的博客-程序员秘密

code tensorflowNon-local 由三个部分组成:U-Net、Residual Blocks、Global Aggregation BlockU-Net作者将原始u-net的concatenation -&gt; sum的原因:求和不会增加特征图的数量,因此会减少下一层中可训练参数的数量。具有求和的skip connection可以被视为远程残差连接,可以促进模型的...

U盘模式无法引导进入pe系统_weixin_30566111的博客-程序员秘密

有些笔记本、一体机 特别是win8、win10系统维护时需要 通过u盘进入pe系统,就是进不去,需要到bios中更改一下设置。 1.首先我们将已经使用u启动u盘启动盘制作工具制作好的启动u盘插入到电脑usb插口(建议直接将u盘插入USB插口处,因为那样传输的性能比前置的要直接),然后开启电脑! 2.开启电脑后当看到开机画面的时候,连续按下键盘上...

Kali与编程:Winserver2019 web服务器使用自签名证书进行https加密域名访问_虚拟域名证书加密用_Kali与编程~的博客-程序员秘密

实验说明:前面的章节我们已经简单学习了windows server2019上如何搭建web服务器的,有的同学可能在上网的过程中会发现有些域名是使用的http访问而有的域名则是使用https加密访问的。那么本章节就由我来教大家如何在windows server2019系统上使用自签名证书进行https的域名访问。在提到HTTPS的证书之前,我们都不可避免会提及HTTP与HTTPS的区别,两者都是进行报文传输的超文本传输协议,但是HTTPS却多出了一个S也就是SSL层(Secure Sockets Laye.

推荐文章

热门文章

相关标签