计算表达式

 

表达式

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的栈顶元素。

原文地址:https://www.cnblogs.com/LK1994/p/2962376.html