写一个表达式计算器,实现一个节点类的继承体系如图B-1右,体会面向对象编程

更多C++学习经验,从《C++ Primer》入手学习C++

写一个表达式计算器,实现一个节点类的继承体系如图B-1右,体会面向对象编程

简单版:表达式求值

NC137:表达式求值

请写一个整数计算器,支持加减乘三种运算和括号。

数据结构介绍的逆波兰表达式法

https://www.cnblogs.com/lulipro/p/7450886.html

#include <iostream>
#include <stack>
using namespace std;
stack<int> nums;
stack<char> signs;
void clac();
void change(string s);
int solve(string s);
int main()
{
    string s;
    while(cin>>s)
    {
        change(s);
        for(int i=0;i<s.size();i++)
        {
            if(s[i]>='0'&&s[i]<='9')
            {
                int j=i;
                int tmp=0;
                while(j<s.size()&&s[j]>='0'&&s[j]<='9')
                {
                    tmp=tmp*10+s[j]-'0';
                    j++;
                }
                nums.push(tmp);
                i=j-1;
            }else if(s[i]=='('){
                   signs.push(s[i]);
            }else if(s[i]=='+'||s[i]=='-')
            {
                    while(!signs.empty()&&signs.top()!='(')
                    clac();
                    signs.push(s[i]);
            }else if(s[i]=='*'||s[i]=='/')
            {
                    while(!signs.empty()&&(signs.top()=='*'||signs.top()=='/'))
                        clac();
                    signs.push(s[i]);
            }else if(s[i]==')')
            {
                    while(!signs.empty()&&signs.top()!='(')
                        clac();
                    signs.pop();
            }
           }

        while(!signs.empty())
            clac();
        int ans=nums.top();
        nums.pop();
       cout<< ans<<endl;
    }
    return 0;
}

int com(int a,int b,char c)
{
    switch(c)
    {
        case '+':
            return a+b;  
        case '-':
            return a-b;  
        case '*':
            return a*b;  
        case '/':
            if(b!=0)
                return a/b;
    }
    return -1;
}
void clac()
{
    int num1=nums.top();
    nums.pop();
    int num2=nums.top();
    nums.pop();
    char mc=signs.top();
    signs.pop();
    nums.push(com(num2,num1,mc));
}
    //在负号前面加“0”
void change(string s)
{
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='-')
        {
            if(i==0)
                s.insert(i, "0");
            if(i>0&&s[i-1]=='(')
                s.insert(i, "0"); 
        }
    }
}

编译原理里面介绍的递归下降法

#include<iostream>
#include<vector>
#include<list>
#include<algorithm>
#include<set>
#include<string>
using namespace std;

int i=0;

int computer(string &str)
{
    int num=0;
    char flag='+';
    list<int> st;
    while(i<str.length())
    {
        if(str[i]=='(')
        {
            i++;
            num=computer(str);
            
        }
        
        while(str[i]>='0'&&str[i]<='9'&&i<str.length())
        {
            num=num*10+str[i]-'0';
            i++;
        }

        switch(flag)
        {
            case '+':
                st.push_back(num);
                break;
            case '-':
                st.push_back(-num);
                break;
            case '*':
                {
                    int pro=st.back();
                    st.pop_back();
                    st.push_back(pro*num);
                    break;
                }
            case '/':
                {
                    int pro=st.back();
                    st.pop_back();
                    st.push_back(pro/num);
                    break;
                }
        }
        num=0;
        flag=str[i];
        
        if (str[i] == ')') 
        {
            i++;
            break;
        }
        i++;
    }
    int sum=0;
    while(st.size())
    {
        sum+=st.back();
        st.pop_back();
    }
    return sum;
}

int main()
{
    string str;
    while(cin>>str)
    {
        cout<<computer(str)<<endl;

    }
    
}

复杂版:四则运算

题目描述

输入一个表达式(用字符串表示),求这个表达式的值。

保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。

扫描二维码关注公众号,回复: 12665226 查看本文章

逆波兰法:

#include <iostream>
#include <stack>
using namespace std;
stack<int> nums;
stack<char> opera;
void change(string s);
void clac();
int com(int a,int b,char c);
int main()
{
    string s;
    while(cin>>s)
    {
        change(s);
        for(int i=0;i<s.size();i++)
        {
            if(s[i]>='0'&&s[i]<='9')
            {
                int j=i;
                int tmp=0;
                while(j<s.size()&&s[j]>='0'&&s[j]<='9')
                {
                    tmp=tmp*10+s[j]-'0';
                    j++;
                }
                nums.push(tmp);
                i=j-1;
            }else if(s[i]=='+'||s[i]=='-')
            {
                while(!opera.empty()&&(opera.top()=='+'||opera.top()=='-'||opera.top()=='*'||opera.top()=='/'))
                {
                    clac();
                }
                opera.push(s[i]);
            }else if(s[i]=='*'||s[i]=='/')
            {
                while(!opera.empty()&&(opera.top()=='*'||opera.top()=='/'))
                {
                    clac();
                }
                opera.push(s[i]);
            }else if(s[i]==')')
            {
                while(!opera.empty()&&opera.top()!='(')
                    clac();
                opera.pop();
            }else if(s[i]==']')
            {
                while(!opera.empty()&&opera.top()!='[')
                    clac();
                opera.pop();
            }else if(s[i]=='}')
            {
                while(!opera.empty()&&opera.top()!='{')
                    clac();
                opera.pop();
            }else if(s[i]=='['||s[i]=='{'||s[i]=='(')
            {
                opera.push(s[i]);
            }
        }
        while(!opera.empty())
        {
            clac();
        }
        int ans=nums.top();
        nums.pop();
        cout<<ans<<endl;
    }
    return 0;
}
int com(int a,int b,char c)
{
    switch(c)
    {
        case '+':
            return a+b;
        case '-':
            return a-b;
        case '*':
            return a*b;
        case '/':
            return a/b;
    }
    return -1;
}
void clac()
{
    int num1=nums.top();
    nums.pop();
    int num2=nums.top();
    nums.pop();
    char op=opera.top();
    opera.pop();
    nums.push(com(num2,num1,op));
}
void change(string s)
{
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='-')
        {
            if(i==0)
                s.insert(i, "0");
            if(i>0&&(s[i-1]=='['||s[i-1]=='{'||s[i-1]=='('))
                s.insert(i, "0");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/haimianjie2012/article/details/111181163