表达式计算c++

2017-03-02  本文已影响211人  小白之白小明

问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

用到了栈的知识,数字建一个栈,符号建一个栈。然后根据符号先后顺序比较,出栈入栈进行计算。

#include<iostream>
#include<string>
#include<stack>
using namespace std;  
char s[110];  
char pre[7][7]={  
    {'>','>','<','<','<','>','>'},  
    {'>','>','<','<','<','>','>'},  
    {'>','>','>','>','<','>','>'},  
    {'>','>','>','>','<','>','>'},  
    {'<','<','<','<','<','=','0'},  
    {'>','>','>','>','0','>','>'},  
    {'<','<','<','<','<','0','='}};  
char procede(char a,char b)  
{  
    int i,j;  
    switch(a)  
    {  
        case'+':i=0;break;  
        case'-':i=1;break;  
        case'*':i=2;break;  
        case'/':i=3;break;  
        case'(':i=4;break;  
        case')':i=5;break;  
        case'#':i=6;break;  
    }  
    switch(b)  
    {  
        case'+':j=0;break;  
        case'-':j=1;break;  
        case'*':j=2;break;  
        case'/':j=3;break;  
        case'(':j=4;break;  
        case')':j=5;break;  
        case'#':j=6;break;  
    }  
    return pre[i][j];  
}     
int operate(int m,int n,char x)  
{  
    if(x=='+')  
    return m+n;  
    if(x=='-')  
    return n-m;  
    if(x=='*')  
    return m*n;  
    if(x=='/')  
    return n/m;  
}  
int main()
{
    int k,y;
    stack <int> shu;
    stack <char> fu;
    char c;
    char ss[2]="#";
    fu.push('#');
    cin>>s;
    strcat(s,ss);
    c=s[0];
    k=1;
    while(c!='#'||fu.top()!='#')  
    {  
        y=0;  
        if(c>='0'&&c<='9')  
        {  
            while(c>='0'&&c<='9')  
            {  
                y=y*10+(c-'0');  
                c=s[k++];  
            }  
            shu.push(y);  
        }
        else
        {
            switch(procede(fu.top(),c))  
            {  
                case'<':  
                    fu.push(c);  
                    c=s[k++];  
                    break;  
                case'=':  
                    fu.pop();  
                    c=s[k++];  
                    break;  
                case'>':  
                    char x=fu.top();fu.pop();  
                    int m=shu.top();shu.pop();  
                    int n=shu.top();shu.pop();  
                    shu.push(operate(m,n,x));  
                    break;    
            } 
        }
    }
    cout<<shu.top();
    system("pause");
    return 0;
}```
上一篇 下一篇

猜你喜欢

热点阅读