题目描述
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>
谢谢大家!
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
2976:All in All查看提交统计提示提问总时间限制: 1000ms 内存限制: 65536kB描述给定两个字符串s和t,请判断s是否是t的子序列。即从t中删除一些字符,将剩余的字符连接起来,即可获得s。输入包括若干个测试数据。每个测试数据由两个ASCII码的数字和字母串s和t组成,s和t的长度不超过100000。输出对每个测试数据,如果
由于一些演示,需要对编码名称等可快速进行修改,需要页面方便配置。由于build后的vue项目基本已经看不出原样,因此需要创建一个文件,并在打包的时候不会进行编译。vue-cli 2.0的作法是在static文件下创建js。vue-cli 3.0 的写法则是直接在public文件夹下创建js、具体操作如下:1、在public文件夹下创建config.js文件,里面文件的语法是es5,不允许使用浏览器...
本文目录: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
原文: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-antd-axios接口会调用两次,但是页面中并没有写调用两次的方法,componentDidMount中值调用了一次,反复查看没有问题,axios中封装的api也没有出现问题。我的项目解决:在包裹着content的路由页面,也就是主页面中componentDidMount写了方法,但是并没有调用api...
Local Color Correction(局部颜色校正)以下大部分引用自:https://www.yanxishe.com/columnDetail/16833前言这个是出自一篇论文里面的算法。论文地址为:http://www.ipol.im/pub/art/2011/gl_lcc/ 。IPOL 是一个非常好的学习数字图像处理的网站,上面的论文都是提供配套源码的,如果平时在数字图像处...
转载链接,方便复习,侵删!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+
文本属性Attributes1.NSKernAttributeName: @10 调整字句 kerning 字句调整2.NSFontAttributeName : [UIFont systemFontOfSize:_fontSize] 设置字体3.NSForegroundColorAttributeName :[UIColor redColor] 设置文字颜色4.NS...
code tensorflowNon-local 由三个部分组成:U-Net、Residual Blocks、Global Aggregation BlockU-Net作者将原始u-net的concatenation -> sum的原因:求和不会增加特征图的数量,因此会减少下一层中可训练参数的数量。具有求和的skip connection可以被视为远程残差连接,可以促进模型的...
有些笔记本、一体机 特别是win8、win10系统维护时需要 通过u盘进入pe系统,就是进不去,需要到bios中更改一下设置。 1.首先我们将已经使用u启动u盘启动盘制作工具制作好的启动u盘插入到电脑usb插口(建议直接将u盘插入USB插口处,因为那样传输的性能比前置的要直接),然后开启电脑! 2.开启电脑后当看到开机画面的时候,连续按下键盘上...
实验说明:前面的章节我们已经简单学习了windows server2019上如何搭建web服务器的,有的同学可能在上网的过程中会发现有些域名是使用的http访问而有的域名则是使用https加密访问的。那么本章节就由我来教大家如何在windows server2019系统上使用自签名证书进行https的域名访问。在提到HTTPS的证书之前,我们都不可避免会提及HTTP与HTTPS的区别,两者都是进行报文传输的超文本传输协议,但是HTTPS却多出了一个S也就是SSL层(Secure Sockets Laye.