带括号的四则运算——华为OJ

来源:互联网 发布:淘宝订单接口 编辑:程序博客网 时间:2024/05/18 21:43

题目:
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注: 1、表达式只含 +, -, *, /, (, ), 四则运算符
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何 字符,不会出现计算溢出情况

充分利用了STL的模板类:栈stack和队列queue 还是最传统的计算方式:先把中缀表达式转换为后缀表达式,再按顺序计算就很简单了

#include<iostream>#include<string>#include<stack>#include<queue>using namespace std;int main(){    string a;    int i=0;    stack<char> s;    queue<char> q;    getline(cin,a);/////////////////////////    s.push(a[1]);    q.push(a[0]);    for(i=2;i<a.size();i++)    {        if((a[i]<='9')&&(a[i]>='0'))            q.push(a[i]);        else if((a[i]=='+')||(a[i]=='-'))        {            if((s.top()=='*')||(s.top()=='/'))            {                q.push(s.top());                s.pop();            }            s.push(a[i]);        }        else if((a[i]=='*')||(a[i]=='/'))            s.push(a[i]);        else if(a[i]=='(')            s.push(a[i]);        else if(a[i]==')')        {            while(s.top()!='(')            {                q.push(s.top());                s.pop();            }            s.pop();        }    }    /////全部出栈////////////////    while(!s.empty())    {        q.push(s.top());        s.pop();    }    //开始计算后缀表达式    //需要用一个栈    stack<int> ans;    int x1,x2;    while(!q.empty())    {        if((q.front()<='9')&&(q.front()>='0'))        {            ans.push(q.front()-'0');            q.pop();        }        else if(q.front()=='+')        {            x2=ans.top();            ans.pop();            x1=ans.top();            ans.pop();            ans.push(x1+x2);            q.pop();        }        else if(q.front()=='-')        {            x2=ans.top();            ans.pop();            x1=ans.top();            ans.pop();            ans.push(x1-x2);            q.pop();        }        else if(q.front()=='*')        {            x2=ans.top();            ans.pop();            x1=ans.top();            ans.pop();            ans.push(x1*x2);            q.pop();        }        else if(q.front()=='/')        {            x2=ans.top();            ans.pop();            x1=ans.top();            ans.pop();            ans.push(x1/x2);            q.pop();        }    }    cout<<ans.top();}
0 0
原创粉丝点击