题目描述
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>
谢谢大家!
前言本文是笔者写CSS时常用的套路。不论效果再怎么华丽,万变不离其宗。1、交错动画有时候,我们需要给多个元素添加同一个动画,播放后,不难发现它们会一起运动,一起结束,这样就会显得很平淡无奇。那么如何将动画变得稍微有趣一点呢?很简单,既然它们都是同一时刻开始运动的,那么让它们不在同一时刻运动不就可以了吗。如何让它们不在同一时刻运动呢?注意到CSS动画...
最近在做全世界国家对应的手机区号的字母表,然后找到一个比较好的,分享给大家,里面有一处排序错误,更正一下,有一个数据是"French Polynesia法属玻利尼西亚 -689",数据里把这个放到首字母p的排列里面了,导致我的字母表排序出错,还有为了方便解析这个Json数据,我用"-"作为分隔符,重新编写了一下数据,我已经用Json检测工具测过了,重新排版的代码符合Json格式。贴上我修改
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&depth_1-utm_s
直接执行如下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 [最后一次执行时间]...
超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等特点。HC-SRO4是一款尺寸完全兼容老版本,增加UART和IIC功能的开放式超声波测距模块,默认条件下,软件与硬件完全兼容老版本HC-SRO4;可以通过电阻设置成UART或IIC模式。2CM盲区,4.5M典型最远测距,2.2mA作电流。采用升级解调芯片RCWL-9206,带UART与IIC功能MCU:使其外围更加简洁,工作电压更宽(3-5.5V),接口功能更多。
一、序言 Opencv中提供Stitcher类,实现了多图像自动拼接,Opencv是开源的,程序实现的源代码都在Opencv安装文件中,以及Opencv提供的函数查询手册和Opencv教程都可以在官网上下载的到,通过这些文档和代码,我们可以很容易就对图像拼接有一个深刻的了解。所以下面,我就教大家怎么把stitcher类的实现源码以及sample的程序变成自己的
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。输入格式:输入在一行中依次给出 A 和 B,中间以 1 空格分隔。输出格式:在一行中依次输出 Q 和 R,中间以 1 空格分隔。输入样例:123456789050987654321 7输出样例:17636684150...
第一部分 如何做到全情投入第一章 什么是精力及如何管理精力大多数人仅仅希望竭尽所能,而当生活的要求超出能力所及,我们会着眼现状提出权宜之计,或许在短期内会运作良好,而负面效应却往往在长期过程中慢慢浮现。我们吝惜睡眠,用外带快餐填饱肚子,用咖啡提神,用酒精和安眠药放松身心。面对工作的无尽索取,我们变得暴躁易怒,注意力也难以集中。结束漫长的一天,我们拖着疲惫的身体回到家里,又常常发觉家庭也不再是欢...
<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/
大家好!今天小编继续给大家介绍Ceph存储系统第四讲《Proxmox部署与应用》。在前几讲给大家介绍了Ceph存储系统基础知识,大家应该已经对Ceph有个大概了解,当然了解归了解,在实际工作中还是以应用为主,不可能给老板只讲概念,总得要给老板一点实际东西看看,当然以学习为主也无妨。言归正传,市场上有很多关于ceph的系统,有收费使用也有免费使用,据小编知道的有VMWARE,OpenStack,Proxmox。这3款应该算是目前比较有名气的。VMWARE的VSAN是收费的,但同时VMWARE在企业应用中也
【51CTO.com独家特稿】十五个秘决搞定你想要的晋升,拿到你应得的薪水怎样评定一名软件开发人员?这是一个颇为奇怪的问题。现在已经有了很多的理论和形式来做这件事,人力资源部门也试着帮你管理和反省自己的行为。然而,怎样才是一个伟大的软件开发人员,在今天,你该怎样发展你的职业生涯?以下是我评定团队中软件开发人员的“军规”。按照这些技巧和规则,你可以改善你的现状,由一个优秀的程序员,成为一名伟大的程序...