1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define N 1010
  4 char s[N];
  5 //字符栈的操作
  6 typedef struct
  7 {
  8   char *base;
  9   char *top;
 10 }SqStack1;
 11 int InitStack1(SqStack1 &S)
 12 {
 13   S.base=(char *)malloc(N*sizeof(char));
 14   if(!S.base)  exit(1);
 15   S.top=S.base;
 16   return 1;
 17 }
 18 int StackEmpty1(SqStack1 &S)
 19 {
 20   if(S.top==S.base)
 21       return 1;
 22   return 0;
 23 }
 24 char GetTop1(SqStack1 S)
 25 {
 26     char e;
 27     if(S.top==S.base)  return 0;
 28     e=*(S.top-1);
 29     return e;
 30 }
 31 int Push1(SqStack1 &S,char e)
 32 {
 33   *S.top++=e;
 34   return 1;
 35 }
 36 int Pop1(SqStack1 &S,char &e)
 37 {
 38   if(S.top==S.base)  return 0;
 39   e=*--S.top;
 40   return 1;
 41 }
 42 //数字栈的操作
 43 typedef struct
 44 {
 45   float *base;
 46   float *top;
 47 }SqStack2;
 48 int InitStack2(SqStack2 &S)
 49 {
 50   S.base=(float *)malloc(N*sizeof(float));
 51   if(!S.base)  exit(1);
 52   S.top=S.base;
 53   return 1;
 54 }
 55 int StackEmpty2(SqStack2 &S)
 56 {
 57   if(S.top==S.base)
 58   return 1;
 59   else return -1;
 60 }
 61 float GetTop2(SqStack2 S)
 62 {
 63     float e;
 64     if(S.top==S.base)  return 0;
 65     e=*(S.top-1);
 66     return e;
 67 }
 68 int Push2(SqStack2 &S,float e)
 69 {
 70   *S.top++=e;
 71   return 1;
 72 }
 73 int Pop2(SqStack2 &S,float &e)
 74 {
 75   if(S.top==S.base)  return 0;
 76   e=*--S.top;
 77   return 1;
 78 }
 79 //转化的操作过程
 80 float Operate(float a,char theta,float b)
 81 {
 82     switch(theta)
 83     {
 84         case '+': return a+b;
 85         case '-': return a-b;
 86         case '*': return a*b;
 87         case '/': return a/b;
 88         default: return 0;
 89     }
 90 }
 91 int level(char c,int i)
 92 {
 93     switch(c)
 94     {
 95         case '=': return 1;
 96         case ')': return i?2:5;
 97         case '+':
 98         case '-': return 3;
 99         case '*':
100         case '/': return 4;
101         case '(': return i?5:2;
102         default : return 0;
103     }
104 }
105 char Precede(char c1,char c2)
106 {
107     int k=(c1=='('&&c2=='=')||(c1=='='&&c2==')')||(c1==')'&&c2=='(');
108     if(!k)
109     {
110         if(c1=='('&&c2==')') return '=';
111         else
112         {
113             if(level(c1,0)<level(c2,1)) return '<';
114             else return '>';
115         }
116     }
117     return 0;
118 }
119 float EvaluateExpression()
120 {
121     SqStack1 OPTR; SqStack2 OPND;
122     char theta,c,x; float a,b,k,t; char *p1,*p=s;
123     InitStack1(OPTR); Push1(OPTR,'=');
124     InitStack2(OPND); c=*p;
125     while(c!='='||GetTop1(OPTR)!='=')
126     {
127         if(!level(c,1))
128         {
129             for(t=k=0;!level(c,1)&&c!='.';c=*++p)
130                 k=10*k+c-'0';
131             if(c=='.')
132             {
133                 while(!level(*++p,1)); c=*p;
134                 for(p1=p-1;*p1!='.';p1--)
135                 t=0.1*t+*p1-'0';
136                 t*=0.1;
137             }
138             Push2(OPND,k+t);
139         }
140         else
141         switch(Precede(GetTop1(OPTR),c))
142         {
143             case'<': Push1(OPTR,c);c=*++p;break;
144             case'=': Pop1(OPTR,x); c=*++p;break;
145             case'>':
146                      Pop1(OPTR,theta);
147                      Pop2(OPND,b); Pop2(OPND,a);
148                      Push2(OPND,Operate(a,theta,b));
149         }
150     }
151     return GetTop2(OPND);
152 }
153 //主函数
154 int main()
155 {
156     int n;
157     scanf("%d%*c",&n);
158     while(n--)
159     {
160         gets(s);
161         printf("%.2f\n",EvaluateExpression());
162     }
163     return 0;
164 }

转载于:https://www.cnblogs.com/shihuajie/archive/2012/08/02/2619282.html

nyoj35 表达式求值相关推荐

  1. 【NYOJ-35】表达式求值——简单栈练习

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(2 ...

  2. c语言求不定式的最大值,C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算...

    运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateEx ...

  3. 经典笔试上机考题-表达式求值

    相信参加过笔试面试同学应当见到过表达式求值这道题,下面列举的一道经典的考题,本文将同大家一起细细探讨一下表达式求值这一类问题的求法,希望抛砖引玉,其中有不妥的地方也请大家多多批评指正. /* 功能:四 ...

  4. NOIP2013普及组 T2 表达式求值

    OJ地址:洛谷P1981 CODEVS 3292 正常写法是用栈 1 #include<iostream> 2 #include<algorithm> 3 #include&l ...

  5. 栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)

    文章目录 实现 顺序栈实现 链式栈实现 应用 函数栈 的应用 表达式求值中 的应用 括号匹配中 的应用 我们使用浏览器的时候经常会用到前进.后退功能. 依次访问完一串页面 a – b – c之后点击后 ...

  6. 【Java】LeetCode 150. 逆波兰表达式求值 (后缀表达式)

    题目: 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话 ...

  7. C语言----表达式求值之隐式类型转换

    前言: 表达式求值的顺序一部分是由操作符的优先级和结合性决定. 同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型,称为隐式类型转换,下面给出隐式类型转换的详细讲解,希望对大家有所帮助~ 隐 ...

  8. [数据结构]表达式求值

    一.问题描述 表达式求值是数学中的一个基本问题,也是程序设计中的一个简单问题.我们所涉及的表达式中包含数字和符号,本实验中处理的符号包括'+'.'-'.'*'.'/'.'('和')',要求按照我们所习 ...

  9. c语言作业算术表达式求值,算术表达式求值演示(C语言版)

    //头文件预处理命令 #include #include //----------函数结果状态代码----------------- #define TRUE 1 #define FALSE 0 #d ...

最新文章

  1. 互联网协议 — TLS — SNI
  2. Delphi Excel操作,写了个ADODataSet转Excel的函数作为后期学习的例子
  3. linux项目变量存放,linux 堆、栈、全局变量存放
  4. 阿里云查看mysql是否安装_阿里云CentOS服务器mysql安装
  5. Qt在VS2010的安装与配置
  6. for语句与if语句嵌套的简单应用
  7. npm-scripts 在 windows 下的兼容问题
  8. java 泛洪攻击_网易有道后端实习面经
  9. 谈谈Http中Get和Post的区别
  10. 微信小程序教程、微信小程序开发资源下载汇总(6.16日更新,持续更新中……)
  11. 找出101-200之间的素数
  12. java 开源mis系统框架_开源 MIS 系统解决方案 jeeww
  13. 用java写布尔矩阵奇偶性
  14. C++逆序数(奇排列和偶排列的判定)
  15. 记Vivado使用,报错记录本
  16. HFSS构建天线对称阵子
  17. 宏碁笔记本u盘装系统如何进入bios设置u盘启动图文教程
  18. Asp.net程序实现RC6_中文加解密
  19. 一个利用浏览器原生execCommand()方法实现的富文本编辑器
  20. 超好用的javascript 实现右加左减

热门文章

  1. 5、Spring Cloud-声明式调用 Feign(下)
  2. SDUT-2054_数据结构实验之链表九:双向链表
  3. bzoj2588: Spoj 10628. Count on a tree 主席树
  4. 第一部分:基础知识(第一章)File | New | Project
  5. opencart出现no such file or dictionary
  6. 推荐轻量高效无依赖的开源JS插件和库
  7. 聊天IM的时间戳显示规则
  8. JetBrains发布Toolbox 采用新的订阅模式
  9. Java团队+.NET团队==足球队+篮球队;我们能否同时培养好2个优秀的精英团队?
  10. 解决XP的IIS HTTP 500”内部服务器错误