四则运算

来源:互联网 发布:挣钱软件 编辑:程序博客网 时间:2024/04/29 02:59

问题 I 算法3-4:表达式求值

时间限制: 1 Sec  内存限制: 128 MB
[提交]

题目描述

算数四则运算的规则是1)先乘除,后加减;2)从左算到右;3)先括号内,后括号外。 由此,算式4+2*3-10/5的计算顺序为4+2*3-10/5=4+6-10/5=4+6-2=8。 给定一个以“#”作为结束符的算式,求出算式的结果。 给出严蔚敏《数据结构(C语言)》中的一段算法描述以作参考:

图1:表达式求值算法

图2:表达式求值算法(续)

图3:表达式求值算法(续

输入

以“#”结尾的表达式,运算数为正整数。每个表达式占一行。

输出

输出表达式运算的结果。

样例输入

4+2*3-10/5#3*(7-2)#2*3/2#

样例输出

8153
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<math.h>int a[100001];//存储符号char b[100001];//存储数字char c[100001];//中转栈int topc=-1;int topab=-1;int ji[10001];topj=-1;int main(){    char s[100001];    int num=0;    int flag=0;    while(~scanf("%s",&s)){            int len=strlen(s);            len--;            int i,j;            for(i=0;i<len;i++)                a[i]=9999;            //for(i=0;i<10;i++)                //printf("%d\n",a[i]);            i=0;            while(i<len){                if(isdigit(s[i])==1){                    while(isdigit(s[i])==1){                        num*=10;                        num+=s[i]-48;                        i++;                    }                    topab++;                    a[topab]=num;                    num=0;                }                else if(s[i]=='('){                    topc++;                    c[topc]=s[i];                    i++;                }                else if(s[i]==')'){                    while(c[topc]!='('){                            topab++;                            b[topab]=c[topc];//printf("%c\n",b[topab]);                            topc--;                          }                          topc--;                          i++;                }                else{                    if(s[i]=='-'){                        if(i==0){                            i++;                            num=0;                            while(isdigit(s[i])==1){                                num*=10;                                num+=s[i]-48;                                i++;                            }                            topab++;                            a[topab]=0-num;                            num=0;                        }                        else{                            if(s[i-1]=='('){                                i++;                                num=0;                                while(isdigit(s[i])==1){                                    num*=10;                                    num+=s[i]-48;                                    i++;                                }                                topab++;                                a[topab]=0-num;                                num=0;                            }                            else{                                while(c[topc]!='('&&topc>=0){                                    topab++;                                    b[topab]=c[topc];//printf("%c\n",b[topab]);                                    topc--;                                    if(topc==-1)                                        break;                                }                                topc++;                                c[topc]=s[i];                                i++;                            }                        }                    }                    else if(s[i]=='+'){                        while(c[topc]!='('&&topc>=0){                            topab++;                            b[topab]=c[topc];//printf("%c\n",b[topab]);                            topc--;                            if(topc==-1)                                break;                        }                        topc++;                        c[topc]=s[i];                        i++;                    }                    else if(s[i]=='*'||s[i]=='/'){                        while((c[topc]=='*'||c[topc]=='/')&&topc>=0){                            topab++;                            b[topab]=c[topc];//printf("%c\n",b[topab]);                            topc--;                            if(topc==-1)                                break;                        }                        topc++;                        c[topc]=s[i];                        i++;                    }                }            }            while(topc>=0){                topab++;                b[topab]=c[topc];//printf("%c\n",b[topab]);                topc--;            }        /*for(i=0;i<=topab;i++){            if(a[i]!=9999)                printf("%d\n",a[i]);            else                printf("%c\n",b[i]);        }*/        for(i=0;i<=topab;i++){            if(a[i]!=9999){                topj++;                ji[topj]=a[i];            }            else{                switch(b[i]){                    case '+':ji[topj-1]=ji[topj-1]+ji[topj];topj--;break;                    case '-':ji[topj-1]=ji[topj-1]-ji[topj];topj--;break;                    case '*':ji[topj-1]=ji[topj-1]*ji[topj];topj--;break;                    case '/':if(ji[topj]!=0){                                    ji[topj-1]=ji[topj-1]/ji[topj];                                    topj--;                                }                                else{                                    flag=1;                                }                                break;                        default:break;                }            }        }        if(!flag){            printf("%d\n",ji[0]);        }        flag=0;        topab=-1;        topj=-1;    }    return 0;}


0 0