表达式计算

表达式计算模板:

  包含+,-,*,/,(),^ 处理,但没有高精度。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
#include<cctype>
#include<cstdlib>
using namespace std;
const int N=1000;
char _stack[N];//运算符的栈
int top;//初始化为-1
int _pow(int x,int y)
{
    if(y==0) return 1;
    if(y==1) return x;
    int cnt;
    cnt=_pow(x,y/2);
    cnt=cnt*cnt;
    if(y&1) cnt*=x;
    return cnt;
}

void _change(string &str,string &res)//第一个参数为中缀表达式,第二个为后缀表达式,初始为空
{
    top=-1;
    int len=str.size();
    for(int i=0;i<len;i++)
    {
        switch(str[i])
        {
            case '(':_stack[++top]='(';break;
            
            case '+':
            case '-':while(top>=0&&_stack[top]!='(')
                           res+=_stack[top--];
                      _stack[++top]=' ';//空格很重要 分隔数字的
                     _stack[++top]=str[i];
                     break;
                     
            case '*':
            case '/':while(top>=0&&_stack[top]!='('&&_stack[top]!='+'&&_stack[top]!='-')
                           res+=_stack[top--];
                     _stack[++top]=' ';
                     _stack[++top]=str[i];
                     break;

            case '^':while(top>=0&&_stack[top]!='('&&_stack[top]!='+'&&_stack[top]!='-'&&_stack[top]!='*'&&_stack[top]!='/')
                           res+=_stack[top--];
                     _stack[++top]=' ';
                     _stack[++top]=str[i];
                     break;

            case ')':while(_stack[top]!='(')
                           res+=_stack[top--];
                     top--;
                     break;
            default:res+=str[i];
                    if(i==len-1) res+=' ';
                    else if(!isdigit(str[i+1])) res+=' ';
        }
    }
    while(top>=0)
    {
        res+=_stack[top--];
    }
}
int _value(string str)//参数为后缀表达式
{
    int cnt,len=str.size();
    top=-1;
    int _digit[N];
    for(int i=0;i<len;i++)
    {
        switch(str[i])
        {
        case ' ':break;//空格很重要 分隔数字的
        case '+':cnt=_digit[top-1]+_digit[top];
                 _digit[--top]=cnt;
                 break;
        case '-':cnt=_digit[top-1]-_digit[top];
                 _digit[--top]=cnt;
                 break;
        case '*':cnt=_digit[top-1]*_digit[top];
                 _digit[--top]=cnt;
                 break;
        case '/':cnt=_digit[top-1]/_digit[top];//此题为整除,因题而异
                 _digit[--top]=cnt;
                 break;
        case '^':cnt=_pow(_digit[top-1],_digit[top]);
                 _digit[--top]=cnt;
                 break;
        default:string temp;
                while(i<len&&isdigit(str[i])) temp+=str[i],i++;i--;
                _digit[++top]=atoi(temp.c_str());
        }
    }
    return _digit[0];
}

int main()
{
    string str,res;
    while(cin>>str)
    {
        res.clear();
        _change(str,res);
        int cnt=_value(res);
        printf("%d\n",cnt);
    }
    return 0;
}
/*
1*2+3*4+5+6*7
*/

  

posted on 2015-04-01 20:48  forgot93  阅读(178)  评论(0编辑  收藏  举报

导航