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

算法训练 表达式计算

作者: 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;
    }
    

    相关文章

      网友评论

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

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