nyoj35 表达式求值
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 表达式求值相关推荐
- 【NYOJ-35】表达式求值——简单栈练习
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(2 ...
- c语言求不定式的最大值,C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算...
运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateEx ...
- 经典笔试上机考题-表达式求值
相信参加过笔试面试同学应当见到过表达式求值这道题,下面列举的一道经典的考题,本文将同大家一起细细探讨一下表达式求值这一类问题的求法,希望抛砖引玉,其中有不妥的地方也请大家多多批评指正. /* 功能:四 ...
- NOIP2013普及组 T2 表达式求值
OJ地址:洛谷P1981 CODEVS 3292 正常写法是用栈 1 #include<iostream> 2 #include<algorithm> 3 #include&l ...
- 栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)
文章目录 实现 顺序栈实现 链式栈实现 应用 函数栈 的应用 表达式求值中 的应用 括号匹配中 的应用 我们使用浏览器的时候经常会用到前进.后退功能. 依次访问完一串页面 a – b – c之后点击后 ...
- 【Java】LeetCode 150. 逆波兰表达式求值 (后缀表达式)
题目: 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话 ...
- C语言----表达式求值之隐式类型转换
前言: 表达式求值的顺序一部分是由操作符的优先级和结合性决定. 同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型,称为隐式类型转换,下面给出隐式类型转换的详细讲解,希望对大家有所帮助~ 隐 ...
- [数据结构]表达式求值
一.问题描述 表达式求值是数学中的一个基本问题,也是程序设计中的一个简单问题.我们所涉及的表达式中包含数字和符号,本实验中处理的符号包括'+'.'-'.'*'.'/'.'('和')',要求按照我们所习 ...
- c语言作业算术表达式求值,算术表达式求值演示(C语言版)
//头文件预处理命令 #include #include //----------函数结果状态代码----------------- #define TRUE 1 #define FALSE 0 #d ...
最新文章
- 互联网协议 — TLS — SNI
- Delphi Excel操作,写了个ADODataSet转Excel的函数作为后期学习的例子
- linux项目变量存放,linux 堆、栈、全局变量存放
- 阿里云查看mysql是否安装_阿里云CentOS服务器mysql安装
- Qt在VS2010的安装与配置
- for语句与if语句嵌套的简单应用
- npm-scripts 在 windows 下的兼容问题
- java 泛洪攻击_网易有道后端实习面经
- 谈谈Http中Get和Post的区别
- 微信小程序教程、微信小程序开发资源下载汇总(6.16日更新,持续更新中……)
- 找出101-200之间的素数
- java 开源mis系统框架_开源 MIS 系统解决方案 jeeww
- 用java写布尔矩阵奇偶性
- C++逆序数(奇排列和偶排列的判定)
- 记Vivado使用,报错记录本
- HFSS构建天线对称阵子
- 宏碁笔记本u盘装系统如何进入bios设置u盘启动图文教程
- Asp.net程序实现RC6_中文加解密
- 一个利用浏览器原生execCommand()方法实现的富文本编辑器
- 超好用的javascript 实现右加左减
热门文章
- 5、Spring Cloud-声明式调用 Feign(下)
- SDUT-2054_数据结构实验之链表九:双向链表
- bzoj2588: Spoj 10628. Count on a tree 主席树
- 第一部分:基础知识(第一章)File | New | Project
- opencart出现no such file or dictionary
- 推荐轻量高效无依赖的开源JS插件和库
- 聊天IM的时间戳显示规则
- JetBrains发布Toolbox 采用新的订阅模式
- Java团队+.NET团队==足球队+篮球队;我们能否同时培养好2个优秀的精英团队?
- 解决XP的IIS HTTP 500”内部服务器错误