title: 表达式求值 第九届省赛 nyoj 1272

tags: [栈,数据结构]

题目链接

描述

假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式。 2. 如果 X 和 Y 是 表达式,则 X+Y, XY 也是表达式; *优先级高于+. 3. 如果 X 和 Y 是 表达式,则 函数 Smax(X,Y)也是表达式,其值为:先分别求出 X ,Y 值的各位数字之和,再从中选最大数。 4.如果 X 是 表达式,则 (X)也是表达式。 例如: 表达式 12(2+3)+Smax(333,220+280) 的值为 69。 请你编程,对给定的表达式,输出其值。

输入

【标准输入】 第一行: T 表示要计算的表达式个数 (1≤ T ≤ 10) 接下来有 T 行, 每行是一个字符串,表示待求的表达式,长度<=1000

输出

【标准输出】 对于每个表达式,输出一行,表示对应表达式的值。

样例输入

3

12+2*3

12*(2+3)

12*(2+3)+Smax(333,220+280)

样例输出

18

60

69

分析:

跟普通的表达式求值得算法没有什么大的区别,也是把中缀表达式转换为后缀表达式,然后用后缀表达式来求解。吧Smax也看做一种与加减乘除一样的运算,而他的优先级是最大的。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. char in[1001];///中缀
  4. char post[1001];///后缀
  5. int pri[200];///优先级
  6. bool isNum(char a)///判断是不是数字
  7. {
  8. if(a>='0'&&a<='9')
  9. return true;
  10. return false;
  11. }
  12. void zhuan()///中缀转后缀
  13. {
  14. stack<char>op;
  15. op.push('=');
  16. int k=0,k1=0;
  17. for(int i=0; in[i]!='\0'; i++)
  18. {
  19. if(in[i]=='m'||in[i]=='a'||in[i]=='x')///'S'也当作一个运算符了,这样的话就不用处理他们了
  20. continue;
  21. if(isNum(in[i]))
  22. {
  23. post[k++]=in[i];
  24. k1++;
  25. }
  26. else
  27. {
  28. if(k1!=0)///有数字的话,就把数字分割开
  29. {
  30. post[k++]=' ';
  31. k1=0;
  32. }
  33. if(in[i]==',')continue;///跳过,不用处理
  34. if(in[i]=='(')
  35. op.push(in[i]);
  36. else if(in[i]==')')
  37. {
  38. while(op.top()!='(')
  39. {
  40. post[k++]=op.top();
  41. op.pop();
  42. }
  43. op.pop();
  44. }
  45. else
  46. {
  47. while(pri[op.top()]>=pri[in[i]])
  48. {
  49. post[k++]=op.top();
  50. op.pop();
  51. }
  52. op.push(in[i]);
  53. }
  54. }
  55. }
  56. while(op.top()!='=')
  57. {
  58. post[k++]=op.top();
  59. op.pop();
  60. }
  61. post[k]='\0';
  62. }
  63. int Smax(int a,int b)///定义Smax的运算
  64. {
  65. int suma=0;
  66. while(a)
  67. {
  68. suma+=a%10;
  69. a/=10;
  70. }
  71. int sumb=0;
  72. while(b)
  73. {
  74. sumb+=b%10;
  75. b/=10;
  76. }
  77. return max(suma,sumb);
  78. }
  79. int result(int a,int b,char op)
  80. {
  81. switch(op)
  82. {
  83. case '+' :
  84. return a+b;
  85. case '-' :
  86. return b-a;
  87. case '*' :
  88. return a*b;
  89. case '/' :
  90. return b/a;
  91. case 'S' :
  92. return Smax(a,b);
  93. }
  94. }
  95. int jisuan()
  96. {
  97. stack<int>num;
  98. int sum=0;
  99. for(int i=0; post[i]; i++)
  100. {
  101. if(isNum(post[i]))
  102. sum=sum*10+post[i]-'0';
  103. else
  104. {
  105. if(sum!=0)
  106. {
  107. num.push(sum);
  108. sum=0;
  109. }
  110. if(post[i]!=' ')
  111. {
  112. int a=num.top();
  113. num.pop();
  114. int b=num.top();
  115. num.pop();
  116. num.push(result(a,b,post[i]));
  117. }
  118. }
  119. }
  120. return num.top();
  121. }
  122. int main()
  123. {
  124. // freopen("2.txt","r",stdin);
  125. ///定义优先级,'S'表示的是Smax这个算法,优先级最大
  126. pri['=']=0;
  127. pri['(']=1;
  128. pri['+']=2;
  129. pri['-']=2;
  130. pri['*']=3;
  131. pri['/']=3;
  132. pri['S']=4;
  133. int t;
  134. scanf("%d",&t);
  135. while(t--)
  136. {
  137. memset(in,0,sizeof(in));
  138. memset(post,0,sizeof(post));
  139. scanf(" %s",in);
  140. zhuan();
  141. //puts(post);
  142. printf("%d\n",jisuan());
  143. }
  144. return 0;
  145. }

NYOJ 1272 表达式求值 第九届省赛 (字符串处理)的更多相关文章

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

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

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

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

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

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

  4. NYOJ 35 表达式求值 (字符串处理)

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

  5. nyoj(表达式求值)

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

  6. NYOJ 35 表达式求值

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

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

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

  8. 河南省acm第九届省赛--《表达式求值》--栈和后缀表达式的变形--手速题

    表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3   描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, ...

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

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

随机推荐

  1. 【week8】psp~~进度条

    本周psp 项目 内容 开始时间 结束时间 中断时间 净时间 10月7日 星期一 论文 看生物信息方面的论文 10:00 12:00 5 115 写代码 注册信息从前台传入servlet 18:00 ...

  2. Mac下使用svn命令

    Mac系统自带svn命令,能够很方便的同步更新代码,使用方法: 1.导入项目svn import /Users/username/Desktop/Project1 svn://192.168.1.12 ...

  3. 大型Java web项目分布式架构演进-分布式部署

    http://blog.csdn.net/binyao02123202/article/details/32340283/ 知乎相关文章https://www.zhihu.com/question/2 ...

  4. Redis 备份数据的两种方式

    既然是数据库,那就一定有数据备份方式了,而且 Redis 是内存形式的数据库,更需要数据备份了,要不然断电数据就全都丢失了. Redis 数据备份有两种方式: RDB(数据快照) AOF(记录操作日志 ...

  5. Bare metal APIs with ASP.NET Core MVC(转)

    ASP.NET Core MVC now provides a true "one asp.net" framework that can be used for building ...

  6. python while 学习

    while True: reply = input('please input:') if reply == 'stop': break else: print (reply.upper())

  7. stm32f4xx系统总线架构

    最近有人在STMCU社区网站咨询如下问题: 由于实验需要,要用到STM32F407的两个DMA并用定时器触发,在使用过程中发现DMA1无法把GPIO的IDR上的数据传输到内存,调试过程中出现DMA1的 ...

  8. 洛谷 P2055 [ZJOI2009]假期的宿舍

    洛谷 P2055 题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C ...

  9. mysql索引长度的一些限制

    一.myisam存储引擎 1. 数据库版本:阿里云RDS MySQL5.1 mysql> select @@version;+-------------------------------+| ...

  10. Zabbix3.4.5部署安装(二)

    一.部署环境 一)系统环境: [root@Node3 ~]# cat /etc/redhat-release //查看系统版本 CentOS Linux release (Core) [root@No ...