这个我是看到华为今年招聘的机试题的第三题。

输入一串算术表达式的字符串,把它的结果算出来。

  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 表达式求值相关推荐

  1. 严蔚敏数据结构C语言版——线性表的链式存储方式详细代码

    一.严蔚敏数据结构C语言版 由于书上的许多地方都是伪代码,所以下面的代码对课本上的做了一些改动,使代码能够正常运行 链表的定义即相关类型定义 typedef int ElementType; type ...

  2. Go语言圣经 - 第7章 接口 - 7.9 表达式求值

    第7章 接口 接口类型是对其它类型行为的抽象和概括.接口类型不会和特定的实现细节绑定在一起,这种抽象的方式能让我们的函数更加的灵活和更具有适应能力 Go语言的接口比较特殊,因为它是满足隐式实现的.也就 ...

  3. 考研961数据结构c语言版真题,严蔚敏数据结构C语言版考研真题库

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 严蔚敏<数据结构>(C语言版)配套题库[考研真题精选(部分视频讲解)+章节题库] 下载来源:http://fangcai.100xuexi.c ...

  4. 数据结构c语言版第三版实验四答案,数据结构(C语言版)第三四章习题答案

    Push( &s, t[i]); while( !EmptyStack( &s)) {// 每弹出一个字符与相应字符比较 temp=Pop (&s); if( temp!=S[ ...

  5. 数据结构使用c语言第5版答案,数据结构(c语言版)第五章答案.doc

    数据结构(c语言版)第五章答案.doc 第五章1.设二维数组A[8][10]是一个按行优先顺序存储在内存中的数组,已知A[0][0]的起始存储位置为1000,每个数组元素占用4个存储单元,求(1)A[ ...

  6. 数据结构c语言版第四章题库,严蔚敏《数据结构(c语言版)习题集》答案第四章 串...

    严蔚敏<数据结构(c语言版)习题集>答案第四章 串 第四章 串 4.10 void String_Reverse(Stringtype s,Stringtype &r)//求s的逆 ...

  7. 数据结构c语言版第四章题库,数据结构(C语言版)(第4版)习题

    数据结构(C语言版)(第4版)习题 习题 11.1 选择题.(1)计算机识别.存储和加工处理的对象统称为 .A.数据 B.数据元素 C.数据结构 D.数据类型(2)数据结构通常是研究数据的 及它们之间 ...

  8. python前缀表达式求值_python数据结构与算法 11 后缀表达式求值

    从本节开始,删除原版的英文,直接发译后的文稿. 后缀表达式求值 栈的最一个应用例子,计算一个后缀表达式的值.这个例子中仍然用栈的数据结构.不过,当扫描表达式的时候,这次是操作数压栈等待,不是转换算法中 ...

  9. 线性表的顺序表示和实现 (创建,插入,删除,查找)数据结构 严蔚敏(C语言版)代码实现

    实现工具:dev 顺序表功能: 创建一个空的线性表: 在线性表中插入元素: 在线性表中删除元素: 在线性表中查找元素: 代码:(详解请看注释) #include<stdio.h> #inc ...

最新文章

  1. php好玩的源码_github上比较有趣的PHP开源项目
  2. python中二分查找什么意思_python中二分查找法的实现方法
  3. 幽灵交易策略_源码 | 幽灵交易者策略
  4. 平衡二叉树AVL插入
  5. K8S集群安装KubeSphere失败记录
  6. python搭建环境的心得体会_python学习第一天_环境的搭建
  7. rabbitmq 客户端golang实战
  8. python 遍历对象_Python遍历对象属性
  9. ping tracert 用法
  10. 多元统计分析 (一):聚类分析
  11. 史上最全的谷歌公司那些黑科技
  12. win10系统安装+激活+去水印
  13. 利用 cookie,实现在html页面 记住我 功能
  14. 百问网7天物联网智能家居(第七天)
  15. 展锐物联网芯片V8811—全球首个PSA认证区块链解决方案
  16. Directx11进阶教程之Tiled Based Deffered Shading
  17. 交换机loopback口
  18. html5播放器插件手机版,Html5弹幕视频播放器插件
  19. 常见各国插头标准图示
  20. 基于QT实现的多媒体播放器

热门文章

  1. JavaScript脚本中 getElementById 返回值总是为空
  2. openresty读取环境变量
  3. Python 学习之中的一个:在Mac OS X下基于Sublime Text搭建开发平台包括numpy,scipy
  4. 从测试的角度来重新反思我们自己的程序以及我们的程序员之路——“通过追本溯源来进行前瞻性思考”...
  5. Mysql修复损坏表并写脚本自动修复
  6. 回答跨专业考研者的几点疑问(计算机考研)
  7. 宁波城市职业技术学院Linux,宁波城市职业技术学院拟聘用人员公示
  8. TMS320C6678中Hyperlink接口的理解
  9. 如何设置MathType下标的正斜体
  10. #ifndef 在头文件中的作用