实现带括号加减乘除运算

来源:互联网 发布:php files 编辑:程序博客网 时间:2024/05/22 01:56
问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

#include <iostream>#include <stack>using namespace std;stack<char> a;stack<int> num;int bj(char a){    if(a == '+') return 1;    if(a == '-') return 1;    if(a == '*') return 2;    if(a == '/') return 2;    if(a == '(') return -1;}int int_pow(int x, int y){    int sum = 1;    for(int i = 0; i < y; i++){        sum *= x;    }    return sum;}int change(string s){    int num = 0;    for(int i = s.length() - 1, j = 0; i >= 0; i--, j++){        num += (s[i] - '0') * int_pow(10, j);    }    return num;}int act(int a, int b, char op){    int result;    switch(op){        case '+':result = a + b;            break;        case '-':result = a - b;            break;        case '*':result = a * b;            break;        case '/':result = a / b;            break;    }    return result;}int main(){    string s;    cin>>s;    s = s + '#';    char op;    int fir, sco, result;    for(int i = 0; i < s.length(); i++){        string s1 = "";        if(s[i] >= '0' && s[i] <= '9'){            while(s[i] >= '0' && s[i] <= '9'){                s1 += s[i];                i++;            }            int k = change(s1);            num.push(k);            i--;        } else {            if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '('){                if(a.empty()){                    a.push(s[i]);                } else {                    if(bj(a.top()) == -1 || bj(s[i]) == -1){                        a.push(s[i]);                    } else if(bj(a.top()) < bj(s[i])){                        a.push(s[i]);                    } else {                        op = a.top();                        a.pop();                        a.push(s[i]);                        sco = num.top();                        num.pop();                        fir = num.top();                        num.pop();                        result = act(fir, sco, op);                        num.push(result);                    }                }            } else {                if(s[i] == ')'){                    op = a.top();                    a.pop();                    if(a.top() == '('){                        a.pop();                        sco = num.top();                        num.pop();                        fir = num.top();                        num.pop();                        result = act(fir, sco, op);                        num.push(result);                    } else {                        while(a.top() != '('){                            sco = num.top();                            num.pop();                            fir = num.top();                            num.pop();                            result = act(fir, sco, op);                            num.push(result);                            op = a.top();                            a.pop();                        }                        a.pop();                        sco = num.top();                        num.pop();                        fir = num.top();                        num.pop();                        result = act(fir, sco, op);                        num.push(result);                    }                } else {                }            }        }    }    while(a.size() > 0){        op = a.top();        a.pop();        fir = num.top();        num.pop();        sco = num.top();        num.pop();        result = act(fir, sco, op);        num.push(result);    }    result = num.top();    cout<<result<<endl;    return 0;}



0 0
原创粉丝点击