题目链接

描述

聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为前缀和后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。

  • 输入

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

    对于每组测试数据输出结果包括三行,先输出转换后的前缀和后缀表达式,再输出计算结果,结果保留两位小数。
  • 样例输入

    2

    1+2=

    (19+21)*3-4/5=
  • 样例输出

    + 1 2 =

    1 2 + =

    3.00

    - * + 19 21 3 / 4 5 =

    19 21 + 3 * 4 5 / - =

    119.20

分析:

我天,二百多行的代码·····

之前一直做的表达式求值都在中缀转换成后缀,然后直接进行计算的,但是这道题还要求输出表达式的前缀形式。本来对于中缀转前缀形式就只是简单的理解,并不太懂要怎么转换,所以很头痛,仔细了解过之后才知道前缀与后缀在转换过程中的原理是一样的,只是后缀是从前到后转换,再从前到后输出来;而前缀是从后到前转换,淡然最后也要从后到前输出来,其他的都没有什么太大的区别。

代码:

  1. #include<string>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<stdio.h>
  5. #include<string.h>
  6. #include<stack>
  7. using namespace std;
  8. char a[1009],b[1009],c[1009];
  9. char pri[300];
  10. char pri1[300];
  11. //
  12. void trans(char a[])///中缀转后缀
  13. {
  14. stack<char>q;///栈用来存储操作数
  15. q.push('=');///用'='压栈,是为了与后来的操作符比较的时候,他的优先级最低
  16. int j=0;
  17. int k=0;
  18. for(int i=0; a[i]!='='; i++)
  19. {
  20. if(a[i]>='0'&&a[i]<='9'||a[i]=='.')///可能有小数
  21. {
  22. b[j++]=a[i];
  23. k++;
  24. }
  25. else
  26. {
  27. if(k!=0)
  28. {
  29. b[j++]=' ';
  30. k=0;
  31. }
  32. if(a[i]=='(')
  33. q.push(a[i]);
  34. else if(a[i]==')')///一直出栈到'('
  35. {
  36. while(q.top()!='(')
  37. {
  38. b[j++]=q.top();
  39. q.pop();
  40. b[j++]=' ';
  41. }
  42. q.pop();
  43. }
  44. else
  45. {
  46. while(pri[a[i]]<=pri[q.top()])///将所有的运算符优先级比当前小的出来
  47. {
  48. b[j++]=q.top();
  49. q.pop();
  50. b[j++]=' ';
  51. }
  52. q.push(a[i]);///在将当前的运算符进栈
  53. }
  54. }
  55. }
  56. int nn=j-1;
  57. if(b[nn]!=' ')
  58. b[j++]=' ';
  59. while(!q.empty()&&q.top()!='=')///栈中的元素也要全部输出
  60. {
  61. b[j++]=q.top();
  62. q.pop();
  63. b[j++]=' ';
  64. }
  65. b[j++]='=';
  66. b[j]='\0';
  67. puts(b);
  68. }
  69. void Trans(char a[])///中缀转前缀
  70. {
  71. stack<char>st;
  72. int len=strlen(a);
  73. int j=0;
  74. int k=0;
  75. for(int i=len-1; i>=0; i--)///逆着转换
  76. {
  77. if(a[i]>='0'&&a[i]<='9'||a[i]=='.')
  78. {
  79. c[j++]=a[i];
  80. k++;
  81. }
  82. else
  83. {
  84. if(k!=0)
  85. {
  86. c[j++]=' ';
  87. k=0;
  88. }
  89. if(a[i]==')')///与转后缀相反,')'直接进栈
  90. {
  91. st.push(a[i]);
  92. }
  93. else if(a[i]=='(')///'('的话要一直找到')'
  94. {
  95. while(st.top()!=')')
  96. {
  97. c[j++]=st.top();
  98. st.pop();
  99. c[j++]=' ';
  100. }
  101. st.pop();
  102. }
  103. else
  104. {
  105. while(!st.empty()&&pri1[st.top()]>pri1[a[i]])///将栈中的优先级比当前大的出栈
  106. {
  107. if(st.top()!='=')
  108. {
  109. c[j++]=st.top();
  110. st.pop();
  111. c[j++]=' ';
  112. }
  113. }
  114. st.push(a[i]);
  115. }
  116. }
  117. }
  118. int hh=j-1;
  119. if(c[hh]!=' ')
  120. c[j++]=' ';
  121. while(!st.empty()&&st.top()!='=')
  122. {
  123. c[j++]=st.top();
  124. c[j++]=' ';
  125. st.pop();
  126. }
  127. int nn=j-1;
  128. if(c[nn]==' ')
  129. nn=j-2;
  130. else
  131. nn=j-1;
  132. for(int kk=nn;kk>=0;kk--)///最后也是要逆着输出来的
  133. printf("%c",c[kk]);
  134. printf(" =\n");
  135. }
  136. double JiSuan(char b[])
  137. {
  138. //puts(b);
  139. char c[100];
  140. memset(c,'\0',sizeof(c));
  141. int j=0;
  142. stack<double>st;
  143. for(int i=0; b[i]!='='; i++)
  144. {
  145. if(b[i]>='0'&&b[i]<='9'||b[i]=='.')
  146. c[j++]=b[i];
  147. else
  148. {
  149. if(j!=0)
  150. {
  151. st.push(atof(c));///自动将字符转换为double
  152. // cout<<"c "<<st.top()<<endl;
  153. memset(c,'\0',sizeof(c));
  154. j=0;
  155. }
  156. if(b[i]!=' ')
  157. {
  158. double n1;
  159. double n2;
  160. double n3;
  161. switch(b[i])
  162. {
  163. case '+':
  164. n1=st.top();
  165. st.pop();
  166. n2=st.top();
  167. st.pop();
  168. n3=n2+n1;
  169. st.push(n3);
  170. break;
  171. case '-':
  172. n1=st.top();
  173. st.pop();
  174. n2=st.top();
  175. st.pop();
  176. n3=n2-n1;
  177. st.push(n3);
  178. break;
  179. case '*':
  180. n1=st.top();
  181. st.pop();
  182. n2=st.top();
  183. st.pop();
  184. n3=n2*n1;
  185. st.push(n3);
  186. break;
  187. case '/':
  188. n1=st.top();
  189. st.pop();
  190. n2=st.top();
  191. st.pop();
  192. n3=n2/n1;
  193. st.push(n3);
  194. break;
  195. }
  196. }
  197. }
  198. }
  199. return st.top();
  200. }
  201. int main()
  202. {
  203. int T;
  204. pri['=']=-1;
  205. pri['(']=0;
  206. pri['+']=1;
  207. pri['-']=1;
  208. pri['*']=2;
  209. pri['/']=2;
  210. pri[')']=3;
  211. pri1['=']=-1;
  212. pri1[')']=0;
  213. pri1['+']=1;
  214. pri1['-']=1;
  215. pri1['*']=2;
  216. pri1['/']=2;
  217. pri1['(']=3;
  218. scanf("%d",&T);
  219. for(int k=1; k<=T; k++)
  220. {
  221. memset(a,'\0',sizeof(a));
  222. memset(b,'\0',sizeof(b));
  223. memset(c,'\0',sizeof(c));
  224. scanf(" %s",a);
  225. // puts(a);
  226. Trans(a);
  227. trans(a);
  228. /// puts(b);
  229. printf("%.2lf\n",JiSuan(b));
  230. }
  231. return 0;
  232. }

NYOJ 409 郁闷的C小加(三) (字符串处理)的更多相关文章

  1. nyoj 409——郁闷的C小加(三)——————【中缀式化前缀后缀并求值】

    郁闷的C小加(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很 ...

  2. NYOJ 267 郁闷的C小加(二) (字符串处理)

    题目链接 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考"郁闷的C小加(一)"),C小加很高兴.但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值 ...

  3. NYOJ 257 郁闷的C小加(一)

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度: 描写叙述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说) ...

  4. nyoj 257 郁闷的C小加(一)(栈、队列)

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  5. NYOJ 257 郁闷的C小加(一) (字符串处理)

    题目链接 描述 我们熟悉的表达式如a+b.a+b(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符 ...

  6. NYOJ-267 郁闷的C小加(二)

    郁闷的C小加(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很 ...

  7. nyoj-257 郁闷的C小加(一) 前缀表达式变后缀

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  8. 郁闷的C小加(一)(后缀表达式)

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  9. nyoj 236 心急的C小加

    心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的 ...

随机推荐

  1. Maven编译打包出错:找不到符号

    项目中,使用的是maven管理,但是有几个jar不是通过maven引入的,是通过IDEA导入的,在使用maven插件编译的时候,会出现如下的一些错误: 解决方法: 在项目中创建一个目录lib,然后将j ...

  2. 对象库(UI MAP)

    目的:能够使用配置文件存储被测页面上元素的定位方式和定位表达式,做到定位数据和程序的分离. 测试程序写好以后,可以方便不具备编码能力的测试人员进行自定义修改和配置 : package dataDriv ...

  3. Halcon 笔记1

    Halcon Example位置: C:\Users\Public\Documents\MVTec\HALCON-13.0\examples 安装位置:C:\Program Files\MVTec\H ...

  4. dom变成jquery对象 先获取dom对象 然后通过$()转换成jquery对象

    dom变成jquery对象   先获取dom对象 然后通过$()转换成jquery对象

  5. BZOJ 2157 旅行(树链剖分码农题)

    写了5KB,1发AC... 题意:给出一颗树,支持5种操作. 1.修改某条边的权值.2.将u到v的经过的边的权值取负.3.求u到v的经过的边的权值总和.4.求u到v的经过的边的权值最大值.5.求u到v ...

  6. P1407 [国家集训队]稳定婚姻

    题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的姗姗和男友谈恋爱半年就结婚,结婚不到 ...

  7. Halum UVA - 11478(差分约束 + 二分最小值最大化)

    题意: 给定一个有向图,每条边都有一个权值,每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的边的权值增加d,最后要让所有边权的最小值非负且尽量大 两个特判 1 ...

  8. Day21-自定义分页

    一. 先简单来个示例 1.1 在urls.py中增加1条,user_list from django.conf.urls import url,include from django.contrib ...

  9. [洛谷P4563][JXOI2018]守卫

    题目大意:有一段$n(n\leqslant5\times10^3)$个点的折线,特殊点可以覆盖它以及它左边的它可以“看见”的点(“看见”指连线没有其他东西阻挡).定义$f_{l,r}$为区间$[l,r ...

  10. 导航控制器里边添加UIScrollView (automaticallyAdjustsScrollViewInsets)

    导航控制器里边如果添加UIScrollView会导致放大操作异常怪异,此时设置 self.automaticallyAdjustsScrollViewInsets = false