思路
中缀转后缀我应经写过了,可以去查看历史文章,这里主要是写后缀表达式求值。
如何求后缀表示式勒?
相关题目
题目
编号: 201903-2
试题名称: 二十四点
时间限制: 1.0s
内存限制: 512.0MB
题目背景
二十四点是一款著名的纸牌游戏,其游戏的目标是使用3个加减乘除运算使得4张纸牌上数字的运算结果为24。
题目描述
定义每一个游戏由4个从1-9的数字和3个四则运算符组成,保证四则运算符将数字两两隔开,不存在括号和其他字符,运算顺序按照四则运算顺序进行。其中加法用符号+表示,减法用符号-表示,乘法用小写字母x表示,除法用符号/表示。在游戏里除法为整除,例如2/3=0,3/2=1,4/2=2。
老师给了你n个游戏的解,请你编写程序验证每个游戏的结果是否为24。
输入格式
从标准输入读入数据。
第一行输入一个整数n,从第2行开始到第n+1行中,每一行包含一个长度为7的字符串,为上述的24点游戏,保证数据格式合法。
输出格式
输出到标准输出。
包含n行,对于每一个游戏,如果其结果为24则输出字符串Yes,否则输出字符串No。
样例数据
样例1输入
10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5
样例1输出
Yes
No
No
Yes
Yes
No
No
No
Yes
Yes
样例1解释
9+3+4×3=24
5+4×5×5=105
7-9-9+8=-3
5×6/5×4=24
3+5+7+9=24
1×1+9-9=1
1×9-5/9=9
8/5+6×9=55
6×7-3×6=24
6×4+4/5=24
题目思路
这个题就可以首先将中缀表达式转化成后缀表达式然后求值,当然这个题没有这个必要,但是我们那这个来练手
代码
//
// Created by admin on 2020/12/7.
//
#include "iostream"
#include "cstdio"
#include "stack"
#include "vector"
using namespace std;
int num(char str){
return str-'0';
}
int solve(){
string str;
cin>>str;
stack<char> a;
vector<char> b;
for (int i=0;i<str.size();i++){
if(str[i]<='9'&&str[i]>='0'){
b.push_back(str[i]);
}
else if(str[i]=='('||a.empty()){
a.push(str[i]);
}
else if (str[i]=='+'||str[i]=='-'){
while(true){
if(a.empty()||a.top()=='('){
a.push(str[i]);
break;
}
else if(a.top()=='x'||a.top()=='/'){
b.push_back(a.top());
a.pop();
}
else if(a.top()=='+'||a.top()=='-'){
b.push_back(a.top());
a.pop();
a.push(str[i]);
break;
}
}
}
else if(str[i]=='x'||str[i]=='/'){
if(a.top()=='('||a.empty()||a.top()=='+'||a.top()=='-'){
a.push(str[i]);
}
else if(a.top()=='x'||a.top()=='/'){
b.push_back(a.top());
a.pop();
a.push(str[i]);
}
}
else if (str[i]==')'){
while(a.top()!='('){
b.push_back(a.top());
a.pop();
}
a.pop();
}
}
while(!a.empty()){
b.push_back(a.top());
a.pop();
}
//将中缀表示式转化成后缀表达式然后存放在b 中,如果想看是否转化成功,可以把 b 输出来看看
int cnt;
stack<int>c;
for (int i=0;i<b.size();i++){
if(b[i]>='0'&&b[i]<='9'){
c.push(num(b[i]));
}
else if (b[i]=='+'||b[i]=='/'||b[i]=='-'||b[i]=='x'){
cnt=c.top();
c.pop();
if(b[i]=='+'){
cnt=cnt+c.top();
c.pop();
c.push(cnt);
}
if(b[i]=='-'){
cnt=c.top()-cnt;
c.pop();
c.push(cnt);
}
if(b[i]=='x'){
cnt=cnt*c.top();
c.pop();
c.push(cnt);
}
if(b[i]=='/'){
cnt=c.top()/cnt;
c.pop();
c.push(cnt);
}
}
}
return c.top();
}
int main(){
int n;
cin>>n;
bool flag[101]={false};
for (int i=0;i<n;i++){
if(solve()==24){
flag[i]=true;
}
}
for (int i=0;i<n;i++){
if(flag[i]==true){
printf("Yes\n");
} else
printf("No\n");
}
return 0;
}
//1+2*3+(4*5+6)*7