题目链接

描述

ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。

比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)

  • 输入

    第一行输入一个整数n,共有n组测试数据(n<10)。每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。数据保证除数不会为0
  • 输出

    每组都输出该组运算式的运算结果,输出结果保留两位小数。
  • 样例输入

    21.000+2/4=((1+2)*5+1)/4=
  • 样例输出

    1.504.00

分析:

数据结构栈的应用,对于一个中缀表达式,我们如果想要计算这个表达式的值的话,可以先将这个中缀表达式转换为后缀形式,然后再用后缀表达式进行计算。

中缀转后缀,定义一个栈存放操作符,一个字符数组存储转换后的后缀形式,转换满足

如果是数字或者'.'的话直接放到后缀表达式中(存点是因为可能有小数),

如果是操作符'('的话就将该操作符直接入栈,如果是操作符')'的话,就将栈顶操作符依次放到后缀表达式中,直到栈顶元素为'('为止,

如果说其他操作符的话,就将该操作符与栈顶操作符的优先级进行比较,当栈顶元素的优先级比该操作符大,就将栈顶元素放到后缀表达式中,当前的操作符入栈

后缀表达式的计算,定义一个操作数栈,存放后缀中取得的操作数,遇到操作符的话,就将栈中的两个元素出栈计算后在讲结果入栈。

代码:

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<stack>
  4. #include<string.h>
  5. #include<stdlib.h>
  6. using namespace std;
  7. char zhong[1000];///存储输入进去的中缀表达式
  8. char hou[1000];///中缀转换后的后缀表达式
  9. int pri[300];///定义相关操作符的优先级
  10. void tran(char zhong[],char hou[])///中缀转后缀
  11. {
  12. stack<char>flag;///定义一个栈,存储操作符
  13. int k=0;
  14. flag.push('=');///首先把'='加入到栈中,起到一个压栈的作用,是为了即使是第一个操作符进栈的话,也比栈顶元素的优先级高,可以直接入栈
  15. for(int i=0; zhong[i]!='='; i++)
  16. {
  17. if(zhong[i]>='0'&&zhong[i]<='9'||zhong[i]=='.')///可能有小数的情况
  18. {
  19. hou[k++]=zhong[i];
  20. }
  21. else
  22. {
  23. hou[k++]='#';///起到将操作数与运算符相分离的作用
  24. if(zhong[i]=='(')///左括号直接入栈
  25. flag.push(zhong[i]);
  26. else if(zhong[i]==')')///如果是右括号的话
  27. {
  28. while(flag.top()!='(')///就一直找到与他相匹配的左括号
  29. {
  30. hou[k++]=flag.top();
  31. flag.pop();
  32. }
  33. flag.pop();
  34. }
  35. else
  36. {
  37. while(pri[flag.top()]>=pri[zhong[i]])///比较当前操作符与栈顶操作符的优先级,栈顶元素的优先级比较大的话,就出栈
  38. {
  39. hou[k++]=flag.top();
  40. flag.pop();
  41. }
  42. flag.push(zhong[i]);///然后把当前的操作符入栈
  43. }
  44. }
  45. }
  46. while(flag.top()!='=')///最后栈中的所有操作符都入后缀序列
  47. {
  48. hou[k++]=flag.top();
  49. flag.pop();
  50. }
  51. hou[k]='\0';
  52. }
  53. double Suan(char hou[])///计算后缀
  54. {
  55. stack<double>shu;///存放操作数
  56. char chun[50];
  57. // memset(chun,'\0',sizeof(chun));
  58. int k=0;
  59. for(int i=0; hou[i]!='\0'; i++)
  60. {
  61. if(hou[i]>='0'&&hou[i]<='9'||hou[i]=='.')
  62. {
  63. chun[k++]=hou[i];
  64. }///将当前这个数取出来
  65. else
  66. {
  67. if(k!=0)
  68. {
  69. shu.push(atof(chun));///将这个字符串类型的数转换为double类型,并入栈
  70. memset(chun,'\0',sizeof(chun));
  71. k=0;
  72. }
  73. if(hou[i]!='#')///如果是操作符的话,就将栈中的两个操作数出栈再将计算后的结果入栈
  74. {
  75. double a,b,c;
  76. a=shu.top();
  77. shu.pop();
  78. b=shu.top();
  79. shu.pop();
  80. switch(hou[i])
  81. {
  82. case '+':
  83. c=a+b;
  84. shu.push(c);
  85. break;
  86. case '-':
  87. c=b-a;
  88. shu.push(c);
  89. break;
  90. case '*':
  91. c=a*b;
  92. shu.push(c);
  93. break;
  94. case '/':
  95. c=b/a;
  96. shu.push(c);
  97. break;
  98. }
  99. }
  100. }
  101. }
  102. return shu.top();
  103. }
  104. int main()
  105. {
  106. int n;
  107. scanf("%d",&n);
  108. pri['=']=-1;///定义优先级最低,只是起到一个压栈的作用
  109. pri['(']=0;
  110. pri['+']=1;
  111. pri['-']=1;
  112. pri['*']=2;
  113. pri['/']=2;
  114. pri[')']=3;
  115. while(n--)
  116. {
  117. scanf(" %s",zhong);
  118. tran(zhong ,hou);
  119. // cout<<hou<<endl;
  120. printf("%.2lf\n",Suan(hou));
  121. }
  122. return 0;
  123. }

NYOJ 35 表达式求值 (字符串处理)的更多相关文章

  1. NYOJ 35 表达式求值(逆波兰式求值)

    http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...

  2. NYOJ 35 表达式求值

    一个模板了 哈哈. 这题由于已经包括了整形.浮点形了,以后也不须要特别处理了. /* 这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达 ...

  3. NYOJ - 35 表达式求值 分类: NYOJ 2015-03-18 10:33 31人阅读 评论(0) 收藏

    #include<iostream> #include<string> #include<stack> #include<cstdio> using n ...

  4. NYOJ 1272 表达式求值 第九届省赛 (字符串处理)

    title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...

  5. nyoj 305 表达式求值 (递归)

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

  6. nyist0j 35 表达式求值

    题目链接:表达式求值 该题以前做过但是WA了,今天终于把他解决了,各种悲剧啊,又是考虑不周到啊................... 所以贴出来纪念一下,并作为一个警示 /**** ps:注意当遇到 ...

  7. NYOJ 305 表达式求值 (字符串处理)

    题目链接 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练, ...

  8. nyoj(表达式求值)

    描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:"1+2 ...

  9. 数据结构--栈的应用(表达式求值 nyoj 35)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...

随机推荐

  1. 爬虫学习之-git拉取远程错误

    本文讲的是把git在最新2.9.2,合并pull两个不同的项目,出现的问题如何去解决 如果合并了两个不同的开始提交的仓库,在新的 git 会发现这两个仓库可能不是同一个,为了防止开发者上传错误,于是就 ...

  2. mysql 数据类型 及 常用命令

    一.数据类型 1.整型 数据类型 存储空间 说明 取值范围 TINYINT 1字节 非常小的整数 带符号值:-128~127 无符号值:0~255 SMALLINT 2字节 较小的整数 带符号值:-3 ...

  3. p2 关节

    P2中使用Constraint及其子类表示关节,也就是将两个刚体按照指定的规则约束在一起,形成有规律的.相互限制的运动模拟.P2关节模拟中,两个刚体没有通过任何刚体连接,只是通过算法模拟出关节运动轨迹 ...

  4. phaser的小游戏的onInputDown问题

    group.inputEnableChildren = true; for (var i = 0; i < 10; i++) {          var sprite = group.crea ...

  5. 解决Qt creator无法输入中文

    详细的方法来自以下网址: http://my.oschina.net/lieefu/blog/505363?p={{currentPage+1}} 需要说明的几点: 设置qmake 的路径使用自身的路 ...

  6. SQL 抛出异常的例子 RAISERROR 的使用

    先创建一个procedure 当输入的值不在0-100之间时会报出异常 create proc proc_x @a int as begin ) ,) else select @a end go 测试 ...

  7. SPOJ3713——Primitive Root

    终于有一个SPOJ题目是我自己独立做出来的,ORZ,太感动了. 题目意思是给你一个素数,问你一个数r是否满足,r,r^2,r^3,……,r^p-1,全不相同. 以前做过这种类型的题目额.是这样的. 根 ...

  8. dom对象转成jquery对象时候 变成数组 jquery转成dom时候 取数组第一个

  9. Golden Tiger Claw UVA - 11383(km原理)

    这题使我对km多了一些看法 写给自己看.. km结束后bx[i] + by[j] == w[i][j], 所以所有bx与by的和即为w的和 而且记住bx[i] + by[j] >= w[i][j ...

  10. 学Python Django学得很迷茫,怎么办?-转自知乎

    本人学生,零编程基础,在学习python的过程中越学越迷茫,感觉像无头苍蝇一样,来知乎取经,下面进入正题吧:        我是先看了中谷的python教学视频,然后跟着慕课网上的python教程把题 ...