严蔚敏《数据结构》C语言版 第三章 算法3.4 表达式求值
这个我是看到华为今年招聘的机试题的第三题。
输入一串算术表达式的字符串,把它的结果算出来。
1 //表达式求值(输入、输出和中间结果均只能是0~9)运算符仅限+-*/。 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #define STACK_INIT_SIZE 100 6 #define STACKINCREMENT 10 7 #define ERROR 0 8 #define OK 1 9 #define MAX 100 10 typedef int SElemType; 11 typedef struct SqStack 12 { 13 char*top; 14 char*base; 15 int stacksize; 16 }SqStack; 17 18 int InitStack(SqStack *S) 19 { 20 (*S).base=(char*)malloc(STACK_INIT_SIZE*sizeof(char)); 21 if(!(*S).base) return ERROR; 22 (*S).top=(*S).base; 23 (*S).stacksize=STACK_INIT_SIZE; 24 return OK; 25 } 26 int Push(SqStack *S,char e) 27 { 28 if(((*S).base-(*S).top)>(*S).stacksize) 29 { 30 (*S).base=(char*)realloc((*S).base, 31 (STACKINCREMENT+(*S).stacksize)*sizeof(char)); 32 (*S).top=(*S).base+(*S).stacksize; 33 (*S).stacksize+=STACKINCREMENT; 34 } 35 if(!(*S).base) 36 { 37 printf("FAILURE to realloc the Memory units!\n"); 38 exit(ERROR); 39 } 40 *((*S).top)++=e; 41 return OK; 42 } 43 int Pop(SqStack *S,char *e) 44 { 45 if((*S).top==(*S).base) 46 { 47 printf("下溢!"); 48 exit(ERROR); 49 } 50 else 51 { 52 *e=*--(*S).top; 53 } 54 return OK; 55 } 56 char GetTop(SqStack S) 57 { 58 if(S.base==S.top) return ERROR; 59 return *(S.top-1); 60 } 61 62 int In(char c) //判断C是否是操作符 63 { 64 switch(c) 65 { 66 case'+': 67 case'-': 68 case'*': 69 case'/': 70 case'(': 71 case')': 72 case'#':return OK; 73 break; 74 default:return ERROR; 75 } 76 77 } 78 79 char Precede(char t1,char t2) // 判断两个运算符的优先级 80 { 81 char f; 82 switch(t2) 83 { 84 case '+': 85 case '-': if(t1=='('||t1=='#') 86 f='<'; 87 else 88 f='>'; 89 break; 90 case '*': 91 case '/':if(t1=='*'||t1=='/'||t1==')') 92 f='>'; 93 else 94 f='<'; 95 break; 96 case '(': if(t1==')') 97 { 98 printf("ERROR1\n"); 99 exit(ERROR);100 }101 else102 f='<';103 break;104 case ')':switch(t1)105 {106 case '(':f='=';107 break;108 case '#':printf("ERROR2\n");109 exit(ERROR);110 default: f='>';111 }112 break;113 case '#':switch(t1)114 {115 case '#':f='=';116 break;117 case '(':printf("ERROR3\n");118 exit(ERROR);119 default: f='>';120 }121 }122 return f;123 }124 125 int operate(int a,char theta,int b)126 {127 int c;128 switch(theta)129 {130 case'+':c=a+b;131 break;132 case'-':c=a-b;133 break;134 case'*':c=a*b;135 break;136 case'/':c=a/b;137 break;138 }139 return c;140 }141 142 char EvaluateExpression()143 {//算术表达是求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈,144 //OP为运算符集合145 char x,a,b;146 char c;147 int e;148 int i,j;149 SqStack OPTR,OPND;150 InitStack(&OPTR);Push(&OPTR,'#');151 InitStack(&OPND);152 printf("请输入算术表达式:以#结束。如3+4-4/2#\n"); 153 c=getchar();154 while(c!='#'||GetTop(OPTR)!='#')155 {156 if(!In(c)) 157 {Push(&OPND,c);c=getchar();} //不是运算符则进栈158 else159 {160 switch(Precede(GetTop(OPTR),c))161 {162 case '<'://栈顶元素优先级低163 Push(&OPTR,c);c=getchar();164 break;165 case'='://脱括号并接收下一个字符166 Pop(&OPTR,&x);c=getchar();167 break;168 case'>'://退栈并将运算结果入栈169 Pop(&OPTR,&x);170 Pop(&OPND,&a);Pop(&OPND,&b);171 i=atoi(&a);j=atoi(&b); //这个函数是别人告诉我的 网上查了用法 172 //用这两个函数可以避免用ASCII码。但是这不是跨平台的。173 e=operate(j,x,i);174 itoa(e,&a,10);175 Push(&OPND,a); 176 break;177 }178 }//else179 }//end_of_while180 return GetTop(OPND);181 }//end_of_EvaluateExpression182 183 int main()184 {185 char a;186 a=EvaluateExpression();187 printf("%c",a);188 printf("\n");189 }
转载于:https://www.cnblogs.com/Jason-Damon/archive/2011/10/09/2203173.html
严蔚敏《数据结构》C语言版 第三章 算法3.4 表达式求值相关推荐
- 严蔚敏数据结构C语言版——线性表的链式存储方式详细代码
一.严蔚敏数据结构C语言版 由于书上的许多地方都是伪代码,所以下面的代码对课本上的做了一些改动,使代码能够正常运行 链表的定义即相关类型定义 typedef int ElementType; type ...
- Go语言圣经 - 第7章 接口 - 7.9 表达式求值
第7章 接口 接口类型是对其它类型行为的抽象和概括.接口类型不会和特定的实现细节绑定在一起,这种抽象的方式能让我们的函数更加的灵活和更具有适应能力 Go语言的接口比较特殊,因为它是满足隐式实现的.也就 ...
- 考研961数据结构c语言版真题,严蔚敏数据结构C语言版考研真题库
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 严蔚敏<数据结构>(C语言版)配套题库[考研真题精选(部分视频讲解)+章节题库] 下载来源:http://fangcai.100xuexi.c ...
- 数据结构c语言版第三版实验四答案,数据结构(C语言版)第三四章习题答案
Push( &s, t[i]); while( !EmptyStack( &s)) {// 每弹出一个字符与相应字符比较 temp=Pop (&s); if( temp!=S[ ...
- 数据结构使用c语言第5版答案,数据结构(c语言版)第五章答案.doc
数据结构(c语言版)第五章答案.doc 第五章1.设二维数组A[8][10]是一个按行优先顺序存储在内存中的数组,已知A[0][0]的起始存储位置为1000,每个数组元素占用4个存储单元,求(1)A[ ...
- 数据结构c语言版第四章题库,严蔚敏《数据结构(c语言版)习题集》答案第四章 串...
严蔚敏<数据结构(c语言版)习题集>答案第四章 串 第四章 串 4.10 void String_Reverse(Stringtype s,Stringtype &r)//求s的逆 ...
- 数据结构c语言版第四章题库,数据结构(C语言版)(第4版)习题
数据结构(C语言版)(第4版)习题 习题 11.1 选择题.(1)计算机识别.存储和加工处理的对象统称为 .A.数据 B.数据元素 C.数据结构 D.数据类型(2)数据结构通常是研究数据的 及它们之间 ...
- python前缀表达式求值_python数据结构与算法 11 后缀表达式求值
从本节开始,删除原版的英文,直接发译后的文稿. 后缀表达式求值 栈的最一个应用例子,计算一个后缀表达式的值.这个例子中仍然用栈的数据结构.不过,当扫描表达式的时候,这次是操作数压栈等待,不是转换算法中 ...
- 线性表的顺序表示和实现 (创建,插入,删除,查找)数据结构 严蔚敏(C语言版)代码实现
实现工具:dev 顺序表功能: 创建一个空的线性表: 在线性表中插入元素: 在线性表中删除元素: 在线性表中查找元素: 代码:(详解请看注释) #include<stdio.h> #inc ...
最新文章
- php好玩的源码_github上比较有趣的PHP开源项目
- python中二分查找什么意思_python中二分查找法的实现方法
- 幽灵交易策略_源码 | 幽灵交易者策略
- 平衡二叉树AVL插入
- K8S集群安装KubeSphere失败记录
- python搭建环境的心得体会_python学习第一天_环境的搭建
- rabbitmq 客户端golang实战
- python 遍历对象_Python遍历对象属性
- ping tracert 用法
- 多元统计分析 (一):聚类分析
- 史上最全的谷歌公司那些黑科技
- win10系统安装+激活+去水印
- 利用 cookie,实现在html页面 记住我 功能
- 百问网7天物联网智能家居(第七天)
- 展锐物联网芯片V8811—全球首个PSA认证区块链解决方案
- Directx11进阶教程之Tiled Based Deffered Shading
- 交换机loopback口
- html5播放器插件手机版,Html5弹幕视频播放器插件
- 常见各国插头标准图示
- 基于QT实现的多媒体播放器
热门文章
- JavaScript脚本中 getElementById 返回值总是为空
- openresty读取环境变量
- Python 学习之中的一个:在Mac OS X下基于Sublime Text搭建开发平台包括numpy,scipy
- 从测试的角度来重新反思我们自己的程序以及我们的程序员之路——“通过追本溯源来进行前瞻性思考”...
- Mysql修复损坏表并写脚本自动修复
- 回答跨专业考研者的几点疑问(计算机考研)
- 宁波城市职业技术学院Linux,宁波城市职业技术学院拟聘用人员公示
- TMS320C6678中Hyperlink接口的理解
- 如何设置MathType下标的正斜体
- #ifndef 在头文件中的作用