华为机试题(仿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

智能推荐

我写CSS的常用套路(附demo的效果实现与源码)_FUNS大师兄的博客-程序员秘密

前言本文是笔者写CSS时常用的套路。不论效果再怎么华丽,万变不离其宗。1、交错动画有时候,我们需要给多个元素添加同一个动画,播放后,不难发现它们会一起运动,一起结束,这样就会显得很平淡无奇。那么如何将动画变得稍微有趣一点呢?很简单,既然它们都是同一时刻开始运动的,那么让它们不在同一时刻运动不就可以了吗。如何让它们不在同一时刻运动呢?注意到CSS动画...

世界国家中英文名称以及地区区号json格式_json 国外名字_那个发饰的博客-程序员秘密

最近在做全世界国家对应的手机区号的字母表,然后找到一个比较好的,分享给大家,里面有一处排序错误,更正一下,有一个数据是"French Polynesia法属玻利尼西亚 -689",数据里把这个放到首字母p的排列里面了,导致我的字母表排序出错,还有为了方便解析这个Json数据,我用"-"作为分隔符,重新编写了一下数据,我已经用Json检测工具测过了,重新排版的代码符合Json格式。贴上我修改

cuda官网打不开,下载速度慢_南木chips的博客-程序员秘密

cuda官网打不开,下载速度慢官网打不开的,可以使用国内镜像网址https://developer.nvidia.cn/downloads具体参考:https://blog.csdn.net/weixin_44065323/article/details/115715271?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link&amp;depth_1-utm_s

SQLServer 查看耗时较多的SQL语句_答案Xstar的博客-程序员秘密

直接执行如下SQL查询:SELECT TOP 20    total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数],    qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)],    last_execution_time AS [最后一次执行时间]...

STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距_嵌入式创客工坊的博客-程序员秘密

超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等特点。HC-SRO4是一款尺寸完全兼容老版本,增加UART和IIC功能的开放式超声波测距模块,默认条件下,软件与硬件完全兼容老版本HC-SRO4;可以通过电阻设置成UART或IIC模式。2CM盲区,4.5M典型最远测距,2.2mA作电流。采用升级解调芯片RCWL-9206,带UART与IIC功能MCU:使其外围更加简洁,工作电压更宽(3-5.5V),接口功能更多。

opencv2.4.9中stitching_detailed源码环境搭建_dxmcu的博客-程序员秘密

一、序言                Opencv中提供Stitcher类,实现了多图像自动拼接,Opencv是开源的,程序实现的源代码都在Opencv安装文件中,以及Opencv提供的函数查询手册和Opencv教程都可以在官网上下载的到,通过这些文档和代码,我们可以很容易就对图像拼接有一个深刻的了解。所以下面,我就教大家怎么把stitcher类的实现源码以及sample的程序变成自己的

随便推点

1017 A除以B(C语言版 + 注释 + 大数相除)_YelloJesse的博客-程序员秘密

本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。输入格式:输入在一行中依次给出 A 和 B,中间以 1 空格分隔。输出格式:在一行中依次输出 Q 和 R,中间以 1 空格分隔。输入样例:123456789050987654321 7输出样例:17636684150...

《精力管理》读书笔记_weixin_34270606的博客-程序员秘密

第一部分 如何做到全情投入第一章 什么是精力及如何管理精力大多数人仅仅希望竭尽所能,而当生活的要求超出能力所及,我们会着眼现状提出权宜之计,或许在短期内会运作良好,而负面效应却往往在长期过程中慢慢浮现。我们吝惜睡眠,用外带快餐填饱肚子,用咖啡提神,用酒精和安眠药放松身心。面对工作的无尽索取,我们变得暴躁易怒,注意力也难以集中。结束漫长的一天,我们拖着疲惫的身体回到家里,又常常发觉家庭也不再是欢...

视频转播的实现与解决方案_水墨熊猫的博客-程序员秘密

<br />播放器:flowplayer 或者 jw_player 等其他支持 RTMP 的 FLV 播放器。<br /><br />转播视频主要有两种,一种为转播服务器上已经存在的视频进行视频点播,一种为接收视频流进行实时直播。<br /><br />参考文章:<br /><br />用Wowza Media Server转播视频:http://sunky045.javaeye.com/blog/538295Wowza Media Server,强悍的媒体服务器:http://args.cn/

Proxmox VE (PVE) 部署与应用多图详解_pve集群部署_PolarisHuster的博客-程序员秘密

大家好!今天小编继续给大家介绍Ceph存储系统第四讲《Proxmox部署与应用》。在前几讲给大家介绍了Ceph存储系统基础知识,大家应该已经对Ceph有个大概了解,当然了解归了解,在实际工作中还是以应用为主,不可能给老板只讲概念,总得要给老板一点实际东西看看,当然以学习为主也无妨。言归正传,市场上有很多关于ceph的系统,有收费使用也有免费使用,据小编知道的有VMWARE,OpenStack,Proxmox。这3款应该算是目前比较有名气的。VMWARE的VSAN是收费的,但同时VMWARE在企业应用中也

如何从优秀的程序员成为伟大的程序员_weixin_34375054的博客-程序员秘密

【51CTO.com独家特稿】十五个秘决搞定你想要的晋升,拿到你应得的薪水怎样评定一名软件开发人员?这是一个颇为奇怪的问题。现在已经有了很多的理论和形式来做这件事,人力资源部门也试着帮你管理和反省自己的行为。然而,怎样才是一个伟大的软件开发人员,在今天,你该怎样发展你的职业生涯?以下是我评定团队中软件开发人员的“军规”。按照这些技巧和规则,你可以改善你的现状,由一个优秀的程序员,成为一名伟大的程序...

推荐文章

热门文章

相关标签