中缀表达式转后缀表达式然后求值--以ccf二十四点为例

思路

中缀转后缀我应经写过了,可以去查看历史文章,这里主要是写后缀表达式求值。
如何求后缀表示式勒?
在这里插入图片描述

相关题目

题目
编号: 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会帮你实现这个功能。以下是代码实现: ```cpp #include <iostream> #include <stack> #include <string> #include <cctype> #include <cmath> using namespace std; int priority(char op) { if (op == '+' || op == '-') return 1; else if (op == '*' || op == '/') return 2; else if (op == '^') return 3; else return 0; } bool isValidExpression(const string& expression) { stack<char> brackets; for (char c : expression) { if (c == '(') brackets.push(c); else if (c == ')') { if (brackets.empty() || brackets.top() != '(') return false; brackets.pop(); } } return brackets.empty(); } double evaluatePostfix(const string& postfix) { stack<double> operands; for (char c : postfix) { if (isdigit(c)) { operands.push(c - '0'); } else { double operand2 = operands.top(); operands.pop(); double operand1 = operands.top(); operands.pop(); double result; switch(c) { case '+': result = operand1 + operand2; break; case '-': result = operand1 - operand2; break; case '*': result = operand1 * operand2; break; case '/': result = operand1 / operand2; break; case '^': result = pow(operand1, operand2); break; default: return 0; // should never reach here } operands.push(result); } } return operands.top(); } string infixToPostfix(const string& infix) { string postfix; stack<char> operators; for (char c : infix) { if (isdigit(c)) { postfix += c; } else if (c == '(') { operators.push(c); } else if (c == ')') { while (!operators.empty() && operators.top() != '(') { postfix += operators.top(); operators.pop(); } if (!operators.empty() && operators.top() == '(') operators.pop(); // pop '(' else return ""; // mismatched parentheses } else { while (!operators.empty() && priority(operators.top()) >= priority(c)) { postfix += operators.top(); operators.pop(); } operators.push(c); } } while (!operators.empty()) { postfix += operators.top(); operators.pop(); } return postfix; } int main() { string expression; cin >> expression; if (!isValidExpression(expression)) { cout << "NO" << endl; return 0; } string postfix = infixToPostfix(expression); if (postfix == "") { cout << "NO" << endl; return 0; } double result = evaluatePostfix(postfix); cout << result << endl; return 0; } ``` 这段代码首先定义了几个辅助函数:`priority()`用于返回运算符的优先级,`isValidExpression()`用于判断表达式中的括号是否匹配,`evaluatePostfix()`用于计算后缀表达式的值,`infixToPostfix()`用于将中缀表达式转换为后缀表达式。 在`main()`函数中,首先读取输入的中缀表达式。然后使用`isValidExpression()`函数判断表达式是否合法,如果不合法则输出"NO"。接着使用`infixToPostfix()`函数将中缀表达式转换为后缀表达式,如果转换失败(例如括号不匹配),则也输出"NO"。最后使用`evaluatePostfix()`函数计算后缀表达式的值,并输出结果。 请注意,在输入中缀表达式时,需要在表达式末尾添加一个结束符"@ ",以便程序正确处理输入。例如,输入"1+2*3@"表示1+2*3这个表达式。 希望这个代码能够满足你的需求!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值