C++算法训练 表达式计算

#include <iostream>
#include <stdio.h>
#include <stack>
using namespace std;
int const MAXN = 100;

stack<int> result;
stack<char> chr;
/*
* 算法训练 表达式计算
* 首先创建两个栈,一个用来存放括号,另一个用来存放运算数字结果
* 如果遇到数字则压入结果栈中
* 如果是左括号,则直接压入运算符的栈
* 如果是运算符,则比较一下,如果栈顶内的运算符优先级高于或者等于当前运算符的优先级,则弹出两个数字
和一个运算符进行运算,结果再存到结果的栈里,直到栈顶运算符低于当前读入的运算符或者遇到(,则把当前运算符压栈
*如果是’)’,则运算'('和')'之间的公式
 *在算式最后加上')'相当于是结束的标志                                                                                                                     *
                                                                                                                                  *如果是‘
*/
    /*
    *函数名:pd()
    * 符号优先级判断
    * @param a, 符号栈顶符号
    * @param b 当前运算符
    * @return 栈顶运算符优先级不低于当前运算符返回true,否则返回false
    */
bool pd(char a, char b){
    if(a == '*' || a == '/'){
        return true;
    }
    if(b == '*' || b == '/' || a=='('){
        return false;
    }
    return true;
}
    /*
    *函数名:f()
    * 对算式运算
    * @param 无
    * @return void
    */
void f(){
    char fh = chr.top();
    chr.pop();
    int num2 = result.top();
    result.pop();
    int num1 = result.top();
    result.pop();
    switch(fh){
    case '+':
        result.push(num1+num2);
        break;
    case '-':
        result.push(num1-num2);
        break;
    case '*':
        result.push(num1*num2);
        break;
    case '/':
        result.push(num1/num2);
        break;
    }
}

int main()
{
    char s[MAXN] = {0};
    cin>>s;
    int len=0;
    while(s[len]!='\0'){
        len++;
    }
    int number=0;
    for(int i=0;i<len;i++){
        //如果是数字直接存入栈中
        if('0'<=s[i] && s[i]<='9'){
            number = s[i]-'0';
            for(i=i+1;i<len;i++){
                if('0'<=s[i] && s[i]<='9'){
                    number = number*10+(s[i]-'0');
                }else{
                    i--;
                    break;
                }
            }
            result.push(number);
            continue;
        }
        //如果是'('直接入符号栈
        if(s[i]=='('){
            chr.push(s[i]);
            continue;
        }
        //如果是运算符
        if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/'){
            if(!chr.empty()){
                while(pd(chr.top(),s[i])){
                f();
                if(chr.empty()){
                    break;
                }
            }
            }
            chr.push(s[i]);
            continue;
        }
        //如果是')'
        if(s[i]==')'){
            while(chr.top()!='('){
                    f();
            }
            chr.pop();
        }
    }
    if(!chr.empty()){
        while(chr.top()){
        f();
        if(chr.empty()){
            break;
        }
    }
    }
    while(!result.empty()){
         cout<<result.top()<<endl;
         result.pop();
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/csdn_chuxuezhe/article/details/79673488