hihocoder1332 简单计算器

来源:互联网 发布:网络安全技术保障方案 编辑:程序博客网 时间:2024/06/08 19:52

描述

编写一个程序可以完成基本的带括号的四则运算。其中除法(/)是整除,并且在负数除法时向0取整。(C/C++/Java默认的除法就是向0取整,python默认的是向负无穷取整。)

例如计算 100 * ( 2 + 12 ) - (20 / 3) * 2, 结果是1388。

输入

一个长度不超过100的字符串,代表要计算的算式。包含数字0-9以及+-*/()。

输入保证计算过程不会超过32位有符号整数,并且其中的'-'都是减号没有负号。

输出

计算的结果。

样例输入
100*(2+12)-(20/3)*2
样例输出
1388

解题思路:运用栈的知识,和分治的思想来模拟,先把中缀表达式转化为后缀表达式(即逆波兰式)然后用栈进行计算。

具体看代码吧:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<string>#include<stack>using namespace std;int getrink(char opt){    if(opt == '+' || opt == '-') return 10;    if(opt == '*' || opt == '/') return 20;    if(opt == '(') return 0;    else return -1;}int postfix(string &str_post,string &str_mid){    stack<char> opt;    while(!opt.empty()) opt.pop();    bool flag=false;    for(int i=0; str_mid[i]!='\0'; i++)    {        if(str_mid[i]>='0'&&str_mid[i]<='9')        {            if(flag)            {                str_post+='&';            }            else            {                flag=true;            }            while(str_mid[i]>='0'&&str_mid[i]<='9')            {                str_post+=str_mid[i];                i++;            }            i--;        }        else if(str_mid[i]=='(')        {            opt.push(str_mid[i]);        }        else if(str_mid[i]==')')        {            if(!opt.empty()&&opt.top()!='(')            {                str_post+=opt.top();                opt.pop();                flag=false;            }            if(opt.top()=='(')            {                opt.pop();            }        }        else if(str_mid[i]=='+'||str_mid[i]=='-'||str_mid[i]=='*'||str_mid[i]=='/')        {            int a1=getrink(str_mid[i]);            int a2;            while(!opt.empty())            {                a2=getrink(opt.top());                if(a1<=a2)                {                    str_post+=opt.top();                    opt.pop();                    flag=false;                }                else{break;}            }            opt.push(str_mid[i]);        }    }    while(!opt.empty()){str_post+=opt.top();opt.pop();}}int getresult(int a,int b,char opp){if(opp=='+') return a+b;if(opp=='-') return a-b;if(opp=='*') return a*b;if(opp=='/') return a/b;}int compute(string str){int op1,op2,temp;stack<int> data;while(!data.empty()) data.pop();for(int i=0;str[i]!='\0';i++){if(str[i]=='&') continue;else if(str[i]>='0'&&str[i]<='9'){temp=0;while(str[i]>='0'&&str[i]<='9'){temp=temp*10+str[i]-'0';i++;}i--;data.push(temp);}else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'){op1=data.top();data.pop();op2=data.top();data.pop();temp=getresult(op2,op1,str[i]);data.push(temp);}}return data.top();}int main(){string str_mid,str_post;while(cin>>str_mid){postfix(str_post,str_mid);    cout << str_post << endl;cout<<compute(str_post)<<endl;}return 0;}

人一我十,人百我万。


原创粉丝点击