四则表达式求值

将中缀表达式转换为后缀表达式

规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号则输出左括号上面的栈元素;是加减或左括号则要看栈顶有没有乘除,有则需要把乘除出栈,再把加减或左括号入栈。

例:9+(3-1)*3+10/2
后缀表达式为:9 3 1 - 3 * 10 2 / + +

将后缀表达式进行运算得出结果

规则:从左到右遍历后缀表达式的每个数字和符号,遇到是数字就进栈,遇到是符号就将处于栈顶的两个数字出栈,进行运算,运算结果进栈,一直到获得结果。

我这个程序忘记了可能会有3位或者更多位数字的情况,可能还需要加个while(),有时间再改一下吧。

#include <iostream>
#include <stack>
#include <string>
#include <sstream>
using namespace std;

stack<char>s1;
stack<int>s2;
string target;
string t;

bool det(char a){
    if(s1.empty())
        return false;
    else{
        if((s1.top()=='*'||s1.top()=='/') && (a=='+' || a == '-' || a=='('))
            return true;
        else return false;
    }
}
void cal1(string tar){
    int flag=0;
    for(int i=0;i<tar.size();i++){
        if(flag == 1){
            flag = !flag;
            continue;
        }
        if(isdigit(tar[i]) && isdigit(tar[i+1])){
            t +=tar[i];
            t +=tar[i+1];
            t+= ' ';
            flag = !flag;
            continue;
        }
        if(isdigit(tar[i])){
            t+=tar[i];t+=' ';}
        else if(tar[i] == '*' || tar[i] == '/')
            s1.push(tar[i]);
        else if(tar[i]=='(' || tar[i] == '+' || tar[i] == '-'){
            if(det(tar[i]))
                while(s1.top()=='*' ||s1.top()=='/'){
                    t+=s1.top();
                    t+=' ';
                    s1.pop();
                }
            s1.push(tar[i]);
        }
        else if(tar[i] == ')'){
            while(s1.top()!='('){
                t+=s1.top();
                t+=' ';
                s1.pop();
            }
            s1.pop();
        }
    }
    while(!s1.empty()){
        t+=s1.top();
        t+=' ';
        s1.pop();
    }
}
//从左到右遍历后缀表达式的每个数字和符号,遇到是数字就进栈,遇到是符号就将处于栈顶的两个数字出栈,进行运算,运算结果进栈,一直到获得结果。
int cal3(int a,int b,char c){
    if(c == '+')
        return a+b;
    else if(c == '-')
        return a-b;
    else if(c== '*')
        return a*b;
    else
        return a/b;
}
int cal2(){
    int a,b;
    string temp;
    stringstream ss;
    int flag = 0;

    for(int i=0;i<t.size();i++){
        if(flag == 1){
            flag = !flag;
            continue;
        }
        if(t[i]==' ')
            continue;
        if(isdigit(t[i]) && isdigit(t[i+1])){
            temp+=t[i];
            temp+=t[i+1];
            ss << temp;
            ss >> a;
            s2.push(a);
            flag = !flag;
            continue;
        }
        if(isdigit(t[i])){
            s2.push(t[i]-'0');
        }
        else{
            a = s2.top();
            s2.pop();
            b = s2.top();
            s2.pop();
            a = cal3(b,a,t[i]);
            s2.push(a);
        }
    }
    return s2.top();
}

int main(){
    cin >> target;
    cal1(target);
    cout << cal2() << endl;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaohaibo_/article/details/79514087
文章标签: 四则表达式求值
个人分类: 算法练习题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭