美文网首页
算法训练 表达式计算

算法训练 表达式计算

作者: DongBold | 来源:发表于2017-03-07 22:57 被阅读129次

问题描述

输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。

输入格式

输入一行,包含一个表达式。

输出格式

输出这个表达式的值。

样例输入

1-2+3*(4-5)

样例输出

-4

数据规模和约定

表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

利用栈和后缀表达式来做

#include <bits/stdc++.h>
using namespace std;

char *infix2postfix(char *exp) {
    char *postExp = new char[200];
    int cnt = 0;
    stack<char> st;
    for(int i = 0; i < strlen(exp); i++) {
        if(isdigit(exp[i])) {
            postExp[cnt++] = exp[i];
        } else {
            if(isdigit(postExp[cnt-1])) {
                postExp[cnt++] = '#';
            }
            if(exp[i] == '+' || exp[i] == '-') {
                if(!st.empty()) {
                    while(!st.empty() && st.top() != '(') {
                        postExp[cnt++] = st.top();
                        st.pop();
                    }
                }
                st.push(exp[i]);
            } else if(exp[i] == '*' || exp[i] == '/' || exp[i] == '(') {
                st.push(exp[i]);
            } else if(exp[i] == ')') {
                while(st.top() != '(') {
                    postExp[cnt++] = st.top();
                    st.pop();
                }
                st.pop();
            }
        }
    } 
    while(!st.empty()) {
        postExp[cnt++] = st.top();
        st.pop();
    }
    
    postExp[cnt] = 0;
    return postExp;
} 

int calculate(char *post) {
    int ans = 0;
    int a, b;
    stack<int> st;
    for (int i = 0; i < strlen(post); i++) {
        a = b = 0;
        if(isdigit(post[i])) {
            while(isdigit(post[i])) {
                b = post[i] - '0';
                a = a * 10 + b;
                i++;
            }
            if(post[i] != '#')
                i--;
            //cout << a << endl; 
            st.push(a);
        } else {
            a = st.top();
            st.pop();
            b = st.top();
            st.pop();
            switch(post[i]) {
                case '+':
                    ans = a + b;    
                    break;
                case '-':
                    ans = b - a;
                    break;
                case '*':
                    ans = a * b;
                    break;
                case '/':
                    ans = b / a;
                    break;
            }
            //cout << ans << endl;
            st.push(ans);
        }
    }
    
    return ans;
}

int main() {
    char exp[101];
    char *postExp = new char[200];
    scanf("%s", exp);
    postExp = infix2postfix(exp);
    //printf("%s\n", postExp);
    printf("%d\n", calculate(postExp));
    
    return 0;
}

相关文章

  • 算法训练 表达式计算

    问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。 输入格式 输入一行,包含一个表...

  • 算法 | 解析算法

    【算法思想】 找出问题的条件与结果之间的数学表达式,再通过表达式的计算来实现问题求解。 【算法实例】 输入已知三角...

  • 堆栈

    堆栈中常见的问题: 问题1: 后缀表达式怎么计算?问题2: 中缀表达式怎么转换成后缀表达式?问题3: 回溯算法问题...

  • 梯度下降算法(gradient descent)

    原理:   每次按照下降的方向进行计算,属于贪心的算法。 算法(就最小二乘法讨论):   若训练集:  训练函数:...

  • 机器学习:算法简介

    K-近邻算法 作用:分类算法 优点:最简单、不需要训练、容易理解 缺点:计算复杂度高、空间复杂度高 原理:计算新数...

  • 算法训练 表达式计算 (中缀表达式转后缀表达式)

    问题描述输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。输入格式输入一行,包含一个表达式。...

  • CSI讲义7: 算法思维训练实例—求解Josephus问题

    训练算法思维是所有CSers的首要任务。--by 咸鱼之友 算法思维的训练是计算机专业学生的必修课,是入门课也是一...

  • 栈的应用无括号算术表达式求值问题

    问题 计算无括号算术表达式的值 问题分析 运算符优先级: 设置#代表表达式结束标志。 算法原理: 例如:1+1*2...

  • 逆波兰式

    逆波兰式,是编程计算四则运算结果的算法。例子:平时写法a+b(中缀表达式),逆波兰式ab+。把中缀表达式编程后缀表...

  • 朴素贝叶斯

    训练算法:从词向量计算概率 输出: 测试算法:根据现实情况修改分类器 输出:['love', 'my', 'dal...

网友评论

      本文标题:算法训练 表达式计算

      本文链接:https://www.haomeiwen.com/subject/efpvgttx.html