• 表达式


    表达式

    Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

    题目描述

    题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2549

          算术表达式的求值我们在小学的时候就已经熟练掌握了。给出若干个只含加减乘的表达式你的任务是计算出结果。为了简化计算,给定的表达式的运算符只包含 ‘+’、‘-’、‘*’。运算符优先级为‘*’ > ‘+’ = ‘-’

    输入

    输入数据的第一行为一个正整数 T (T <= 100),表示有 T 组测试数据。
    对于每组测试数据,输入一行表达式,由数字、运算符组成,且数字和运算符之间没有空格。数字均为整数, 运算符为 ‘+’,‘ –’,‘*’ 中的一个,表达式字符串长度<=100。
    数字保证没有前导0,任意两个数字之间有且仅有一个运算符(不会出现3--2 等情况),运算中间结果及最终结果保证在int范围内。

    输出

    对于每组测试数据,输出表达式的结果。

    示例输入

    1
    1-2*3

    示例输出

    -5

    测试数据全都正确,但是提交上总是wrong answer,个人认为应该是整数的问题,在本代码中,整数的取值范围是0~9,一旦超出,就会出错;
    思路就是先转换成后缀式,再由后缀式求值。
      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<stdlib.h>
      4 char zhan[300];
      5 int top=-1;
      6 void ruzhan(char ch)
      7 {
      8     zhan[++top]=ch;
      9 }
     10 int cmp(char ch)
     11 {
     12     if(ch=='+'||ch=='-')return 1;
     13     if(ch=='*'||ch=='/')return 2;
     14     if(ch=='(')return 3;
     15 }
     16 int main()
     17 {
     18     int zong ;
     19     //while(scanf("%d",&zong)!=EOF)
     20     scanf("%d",&zong );
     21     {
     22         while(zong--)
     23         {
     24             top=-1;
     25             char g[300];
     26             int t=-1;
     27             char f[300];
     28             scanf("%s",f);
     29             int len=strlen(f);
     30             int i;
     31             for(i=0; i<=len-1; i++)
     32             {
     33                 if((f[i]>='0'&&f[i]<='9')||(f[i]>='a'&&f[i]<='z'))
     34                     g[++t]=f[i];
     35                 else//如果是运算符的话
     36                 {
     37                     if(f[i]=='(')ruzhan(f[i]);//运算符是左括号
     38                     else if(f[i]==')')//运算符是右括号
     39                     {
     40                         for(; zhan[top]!='('; top--)
     41                         {
     42                             g[++t]=zhan[top];
     43                         }
     44                         --top;
     45                     }
     46                     else//运算符是加减乘除运算符中的一种运算符
     47                     {
     48                         if(cmp(f[i])>cmp(zhan[top]))//当前运算符优先级大于栈顶运算符的优先级
     49                             ruzhan(f[i]);
     50                         else//当前运算符优先级小于等于栈顶运算符优先级
     51                         {
     52                             if(zhan[top]=='(')ruzhan(f[i]);//栈顶运算符是左括号的特殊情况
     53                             else//栈顶运算符是加减乘除四种运算符的一种
     54                             {
     55                                 while(cmp(f[i])<=cmp(zhan[top]))//当前运算符优先级小于等于栈顶运算符优先级的时候执行循环体
     56                                 {
     57                                     g[++t]=zhan[top];
     58                                     top--;
     59                                 }
     60                                 ruzhan(f[i]);
     61                             }
     62                         }
     63                     }
     64                 }
     65             }
     66             for(; top>=0; top--)
     67                 g[++t]=zhan[top];
     68             /*//验证输出后缀式
     69             for(i=0;i<=t;i++)
     70             printf("%c",g[i]);
     71             printf("
    ");
     72             */
     73             int h[300];
     74             top=-1;
     75             int sum;
     76             for(i=0; i<=t; i++)
     77             {
     78                 if(g[i]>='0'&&g[i]<='9')
     79                 {
     80                     h[++top]=g[i]-'0';
     81                 }
     82                 else
     83                 {
     84                     switch(g[i])
     85                     {
     86                     case '+':
     87                         sum=h[top-1]+h[top];
     88                         break;
     89                     case '-':
     90                         sum=h[top-1]-h[top];
     91                         break;
     92                     case '*':
     93                         sum=h[top-1]*h[top];
     94                         break;
     95                     case '/':
     96                         sum=h[top-1]/h[top];
     97                         break;
     98                     }
     99                     top=top-2;
    100                     h[++top]=sum;
    101                 }
    102             }
    103             printf("%d
    ",h[0]);
    104         }
    105     }
    106     return 0;
    107 }
    View Code

     9月27号:

    正确的代码是:

      1 #include<iostream>
      2 #include<string.h>
      3 using namespace std;
      4 struct vode
      5 {
      6     int date;
      7     int flag1;
      8     char ch;
      9     int flag2;
     10 };
     11 int cmp(char ch)
     12 {
     13     if(ch=='+'||ch=='-')return 1;
     14     if(ch=='*'||ch=='/')return 2;
     15     if(ch=='(')return 3;
     16 }
     17 int zhuanhuan(int n)
     18 {
     19     int i,sum=1;
     20     for(i=0;i<=n-1;i++)
     21         sum*=10;
     22     return sum;
     23 }
     24 int zhuanzhi(char f[],int t)
     25 {
     26     int i,s=t;
     27     int sum=0;
     28     for(;t>=0;t--)
     29     {
     30         sum+=zhuanhuan(s-t)*(f[t]-'0');
     31     }
     32     return sum;
     33 }
     34 void hanshu(struct vode f[],int n);
     35 int main()
     36 {
     37     int zong ;
     38     cin>>zong ;
     39     while(zong--)
     40     {
     41         char f[106];
     42         char zhan[106];
     43         int top=-1;
     44         struct vode bds[106];
     45         memset(bds,0,sizeof(bds));
     46         int t=-1;
     47         cin>>f;
     48         int lenth=strlen(f);
     49         int i,j;
     50         for(i=0;i<=lenth-1;i++)
     51         {
     52             int sum=0;
     53             if(f[i]>='0'&&f[i]<='9')
     54             {
     55                 char zs[105];
     56                 int st=-1;
     57                 i--;
     58                 int j=i;
     59                 do
     60                 {
     61                     i++;
     62                     j++;
     63                     zs[++st]=f[j];
     64                 }
     65                 while(f[j+1]>='0'&&f[j+1]<='9');
     66                 bds[++t].date=zhuanzhi(zs,st);
     67                 bds[t].flag1=1;
     68             }
     69             else
     70             {
     71                 if(f[i]=='(')
     72                 {
     73                     zhan[++top]='(';
     74                 }
     75                 else if(f[i]==')')
     76                 {
     77                     for(;zhan[top]!='(';top--)
     78                     {
     79                         bds[++t].ch=zhan[top];
     80                         bds[t].flag2=1;
     81                     }
     82                     top--;
     83                 }
     84                 else
     85                 {
     86                     if(cmp(zhan[top])<cmp(f[i]))
     87                     {
     88                         zhan[++top]=f[i];
     89                     }
     90                     else
     91                     {
     92                         while(cmp(zhan[top])>=cmp(f[i])&&zhan[top]!='(')
     93                         {
     94                             bds[++t].ch=zhan[top];
     95                             bds[t].flag2=1;
     96                             top--;
     97                         }
     98                         zhan[++top]=f[i];
     99                     }
    100                 }
    101             }
    102         }
    103         for(;top>=0;top--)
    104         {
    105             bds[++t].ch=zhan[top];
    106             bds[t].flag2=1;
    107         }
    108         //验证输出
    109         /*for(i=0;i<=t;i++)
    110         {
    111             if(bds[i].flag1)cout<<bds[i].date;
    112             if(bds[i].flag2)cout<<bds[i].ch;
    113         }
    114         cout<<endl;*/
    115         hanshu(bds,t);
    116     }
    117     return 0;
    118 }
    119 void hanshu(struct vode bds[],int s)
    120 {
    121     int i,t=-1;
    122     int zhan[1008];
    123     for(i=0;i<=s;i++)
    124     {
    125         if(bds[i].flag1)
    126             zhan[++t]=bds[i].date;
    127         else
    128         {
    129             switch(bds[i].ch)
    130             {
    131             case '+':
    132                 zhan[t-1]=zhan[t-1]+zhan[t];break;
    133             case '-':
    134                 zhan[t-1]=zhan[t-1]-zhan[t];break;
    135             case '*':
    136                 zhan[t-1]=zhan[t-1]*zhan[t];break;
    137             case '/':
    138                 zhan[t-1]=zhan[t-1]/zhan[t];break;
    139             }
    140             t--;
    141         }
    142     }
    143     cout<<zhan[0]<<endl;
    144 }
    View Code

     线性表代码:runtime error

      1 //线性表代码:re了
      2 #include<iostream>
      3 #include<string.h>
      4 #include<stdlib.h>
      5 using namespace std;
      6 const int maxx=1000;
      7 struct vode
      8 {
      9     int date;
     10     int flag1;
     11     char ch;
     12     int flag2;
     13 };
     14 typedef struct
     15 {
     16     struct vode *elem;
     17     int top;
     18     int stacksize;
     19 } hzsz;
     20 typedef struct
     21 {
     22     char *elem;
     23     int top;
     24     int stacksize;
     25 } ysfz;
     26 typedef struct
     27 {
     28     char *f;
     29     int length;
     30     int stacksize;
     31 } inz;
     32 int cmp(char ch);
     33 void inite(hzsz &l1,ysfz &l2,inz &l3);
     34 int zhuanhuan(int n);
     35 int zhuanzhi(char f[],int t);
     36 void hzbds(inz &in,hzsz &hzs,ysfz &ysf);
     37 void qiuzhi(hzsz &hzs);
     38 int main()
     39 {
     40     int zong ;
     41     cin>>zong ;
     42     while(zong--)
     43     {
     44     hzsz hzs;
     45     ysfz ysf;
     46     inz in;
     47     inite(hzs,ysf,in);
     48     cin>>in.f;
     49     hzbds(in,hzs,ysf);
     50     }
     51     return 0;
     52 }
     53 int cmp(char ch)
     54 {
     55     if(ch=='+'||ch=='-')return 1;
     56     else if(ch=='*'||ch=='/')return 2;
     57     else if(ch=='(')return 3;
     58 }
     59 void inite(hzsz &l1,ysfz &l2,inz &l3)
     60 {
     61     l1.elem=(struct vode *)malloc(maxx*sizeof(struct vode));
     62     //memset(l1.elem,0,sizeof(l1.elem));
     63     int i;
     64     for(i=0;i<=999;i++)
     65     {
     66         l1.elem[i].flag1=0;
     67         l1.elem[i].flag2=0;
     68     }
     69     l1.stacksize=maxx;
     70     l1.top=-1;
     71     l2.elem=(char *)malloc(maxx*sizeof(char));
     72     l2.stacksize=maxx;
     73     l2.top=-1;
     74     l3.f=(char *)malloc(maxx*sizeof(char));
     75     l3.stacksize=maxx;
     76 }
     77 int zhuanhuan(int n)
     78 {
     79     int i,sum=1;
     80     for(i=0; i<=n-1; i++)
     81         sum*=10;
     82     return sum;
     83 }
     84 int zhuanzhi(char f[],int t)
     85 {
     86     int s=t;
     87     int sum=0;
     88     for(; t>=0; t--)
     89     {
     90         sum+=zhuanhuan(s-t)*(f[t]-'0');
     91     }
     92     return sum;
     93 }
     94 void hzbds(inz &in,hzsz &hzs,ysfz &ysf)
     95 {
     96     in.length=strlen(in.f);
     97     int i;
     98     for(i=0; i<=in.length-1; i++)
     99     {
    100         if(in.f[i]>='0'&&in.f[i]<='9')
    101         {
    102             char zs[106];
    103             int st=-1;
    104             i--;
    105             do
    106             {
    107                 i++;
    108                 zs[++st]=in.f[i];
    109             }
    110             while(in.f[i+1]>='0'&&in.f[i+1]<='9');
    111             hzs.elem[++hzs.top].date=zhuanzhi(zs,st);
    112             hzs.elem[hzs.top].flag1=1;
    113         }
    114         else
    115         {
    116             if(in.f[i]=='(')
    117             {
    118                 ysf.elem[++ysf.top]=in.f[i];
    119             }
    120             else if(in.f[i]==')')
    121             {
    122                 for(; ysf.elem[ysf.top]!='('; ysf.top--)
    123                 {
    124                     hzs.elem[++hzs.top].ch=ysf.elem[ysf.top];
    125                     hzs.elem[hzs.top].flag2=1;
    126                 }
    127                 ysf.top--;
    128             }
    129             else
    130             {
    131                 if(ysf.top==-1)
    132                 {
    133                     ysf.elem[++ysf.top]=in.f[i];
    134                 }
    135                 else if(cmp(ysf.elem[ysf.top])<cmp(in.f[i]))
    136                 {
    137                 ysf.elem[++ysf.top]=in.f[i];
    138                 }
    139                 else
    140                 {
    141                     while(cmp(ysf.elem[ysf.top])>=cmp(in.f[i])&&ysf.elem[ysf.top]!='('&&ysf.elem[i]!=-1)
    142                     {
    143                         hzs.elem[++hzs.top].ch=ysf.elem[ysf.top];
    144                         hzs.elem[hzs.top].flag2=1;
    145                         ysf.top--;
    146                     }
    147                     ysf.elem[++ysf.top]=in.f[i];
    148                 }
    149             }
    150         }
    151     }
    152     for(; ysf.top>=0; ysf.top--)
    153     {
    154         hzs.elem[++hzs.top].ch=ysf.elem[ysf.top];
    155         hzs.elem[hzs.top].flag2=1;
    156     }
    157     /*验证输出
    158     for(i=0; i<=t; i++)
    159     {
    160         if(hzs.elem[i].flag1==1)cout<<hzs.elem[i].date<<" ";
    161         if(hzs.elem[i].flag2==1)cout<<hzs.elem[i].ch<<" ";
    162         //else cout<<hzs.elem[i].ch;
    163        // cout<<hzs.elem[i].flag1<<hzs.elem[i].date<<endl;
    164         //cout<<hzs.elem[i].flag2<<hzs.elem[i].ch<<endl<<endl;
    165     }
    166     cout<<endl;*/
    167     qiuzhi(hzs);
    168 }
    169 void qiuzhi(hzsz &hzs)
    170 {
    171     double number[106];
    172     int st=-1,i;
    173     for(i=0;i<=hzs.top;i++)
    174     {
    175         if(hzs.elem[i].flag1==1)
    176         {
    177             number[++st]=hzs.elem[i].date;
    178         }
    179         else
    180         {
    181             switch (hzs.elem[i].ch)
    182             {
    183             case '+':number[st-1]=number[st-1]+number[st];break;
    184             case '-':number[st-1]=number[st-1]-number[st];break;
    185             case '*':number[st-1]=number[st-1]*number[st];break;
    186             case '/':number[st-1]=number[st-1]/number[st];break;
    187             }
    188             st--;
    189         }
    190     }
    191     cout<<number[0]<<endl;
    192 }
    View Code
  • 相关阅读:
    springmvc 处理静态资源
    springmvc jsp 获取 上下文
    springmvc 如何设置首页
    servlet-mapping url-pattern / 和 /*区别
    nginx支持php
    openresty 变量
    git tag用法
    python 导入模块,__init__.py 的作用
    python 转码问题
    python装饰器
  • 原文地址:https://www.cnblogs.com/kuangdaoyizhimei/p/3272059.html
Copyright © 2020-2023  润新知