• 计算表达式


     

    表达式

    Time Limit: 1000MS    Memory limit: 65536K

    题目描述

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

    输入

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

    输出

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

    示例输入

    1
    1-2*3

    示例输出

    -5
    01.#include<stdio.h>  
    02.#include<string.h>  
    03.struct  
    04.{  
    05.    char data[110];  
    06.    int top;  
    07.}op;  
    08.struct  
    09.{  
    10.    int data[110];  
    11.    int top;  
    12.}st;  
    13.void trans(char exp[],char postexp[])  
    14.{  
    15.    char ch;  
    16.    int i=0,j=0;  
    17.    op.top=-1;  
    18.    ch=exp[i++];  
    19.  
    20.    while(ch!='\0')  
    21.    {  
    22.        switch(ch)  
    23.        {  
    24.            case '(': op.top++; op.data[op.top]=ch;  
    25.                      break;  
    26.            case ')':  
    27.                while(op.data[op.top]!='(')  
    28.                      {  
    29.                          postexp[j]=op.data[op.top];  
    30.                          j++;op.top--;  
    31.                      }  
    32.                op.top--;  
    33.                break;  
    34.            case  '+':  
    35.            case  '-':  
    36.                while(op.top!=-1&&op.data[op.top]!='(')  
    37.                      {  
    38.                          postexp[j]=op.data[op.top];  
    39.                          j++; op.top--;  
    40.                      }  
    41.                op.top++;  
    42.                op.data[op.top]=ch;  
    43.                break;  
    44.            case '*':  
    45.            case '/':  
    46.                while(op.top!=-1&&op.data[op.top]!='('&&(op.data[op.top]=='*'||op.data[op.top]=='/'))  
    47.                {  
    48.                    postexp[j]=op.data[op.top];  
    49.                    j++; op.top--;  
    50.                }  
    51.                op.top++;  
    52.                op.data[op.top]=ch;  
    53.                break;  
    54.            default:  
    55.                while(ch>='0'&&ch<='9')  
    56.                {  
    57.                    postexp[j]=ch; j++;  
    58.                    ch=exp[i];i++;  
    59.                }  
    60.                i--;  
    61.                postexp[j]='#';j++;  
    62.        }  
    63.        ch=exp[i++];  
    64.    }  
    65.    while(op.top!=-1)  
    66.    {  
    67.        postexp[j]=op.data[op.top];  
    68.        j++; op.top--;  
    69.    }  
    70.    postexp[j]='\0';  
    71.}  
    72.int compvalue(char postexp[])  
    73.{  
    74.    int d;  
    75.    char ch;  
    76.    int i=0;  
    77.    st.top=-1;  
    78.    ch=postexp[i];i++;  
    79.    while(ch!='\0')  
    80.    {  
    81.        switch(ch)  
    82.        {  
    83.            case '+':st.data[st.top-1]=st.data[st.top-1]+st.data[st.top];  
    84.                     st.top--;break;  
    85.            case '-':st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];  
    86.                     st.top--;break;  
    87.            case '*':st.data[st.top-1]=st.data[st.top-1]*st.data[st.top];  
    88.                     st.top--;break;  
    89.            default:  
    90.                    d=0;  
    91.                    while(ch>='0'&&ch<='9')  
    92.                    {  
    93.                        d=10*d+ch-'0';  
    94.                        ch=postexp[i];i++;  
    95.                    }  
    96.                    st.top++;  
    97.                    st.data[st.top]=d;  
    98.        }  
    99.        ch=postexp[i];i++;  
    100.    }  
    101.    return st.data[st.top];  
    102.}  
    103.int main ()  
    104.{  
    105.    int t,sum;  
    106.    char exp[110],postexp[110];  
    107.    scanf("%d%*c",&t);  
    108.    while(t--)  
    109.    {  
    110.      scanf("%s",exp);  
    111.      trans( exp, postexp);  
    112.       sum=compvalue( postexp);  
    113.      printf("%d\n",sum);  
    114.    }  
    115.    return 0;  
    116.}  
    117.   
    118.  
    119.  
    120.  


        计算表达式,先将表达式转换成后缀式,再计算后缀式的值。exp存放输入的字符串,postexp存放后缀表达式,定义结构体op,

    作为运算符栈。将运算符按规则进栈或出栈,若是'('直接进栈,若是')'则将左右括号之间的全部运算符出栈进入postexp数组中,

    并将左括号删除,当运算符优先级不大于op运算符栈中的栈顶元素的优先级时,则依次出栈放入postexp中并将该运算符进栈。当exp

    扫描完毕,把op中的元素全部出栈并放到postexp中。计算结果时,再定义结构体st存放每次计算的结果,最后输出st的栈顶元素。

  • 相关阅读:
    Quartz快速入门 (转自 http://www.blogjava.net/baoyaer/articles/155645.html)
    C#HTML 转文本及HTML内容提取
    创建连接字符串方法
    源生js _AJax
    .NET里面附件上传大小限制的控制
    错误记录 COM
    Quartz的cron表达式
    Quartz 多任务调用
    Myeclipse的web工程和Eclipse互相转换
    Myeclipse8.0序列号生成程序
  • 原文地址:https://www.cnblogs.com/LK1994/p/2962376.html
Copyright © 2020-2023  润新知