题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12817

解题报告:定义两种运算符号,一种是>>,就是右移,另一种是S<x>,S<X> = (X^2) % (1e9+7);

跟其它表达式求值一样,用两个栈,一个存操作数,另一个存操作符,有一个问题就是>这是符号到底是S<>它的一部分还是>>它的一部分,因为符号>>紧挨右边一定要有操作数的,而S<>紧挨右边是一定没有操作数的,所以只要看是不是两个连续的>,并且紧挨右边有没有操作数,如果都符合的话就是>>。然后就是每次计算完S<>这个之后要对符号栈的栈顶进行判断,如果是>>就要继续计算。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<deque>
  6. #include<cstdlib>
  7. using namespace std;
  8. typedef long long INT;
  9. const INT MOD = ;
  10. const int maxn = +;
  11. char str[maxn],temp[maxn];
  12. int get_num(INT s,INT t)
  13. {
  14. for(int i = ;i < t;++i)
  15. {
  16. s = s >> ;
  17. if(s == )
  18. return ;
  19. }
  20. return s;
  21. }
  22. int main()
  23. {
  24. while(gets(temp))
  25. {
  26. if(temp[] == '#')
  27. break;
  28. int len = strlen(temp),f = ;
  29. for(int i = ;i < len; ++i)
  30. if(temp[i] != ' ')
  31. str[f++] = temp[i];
  32. str[f] = NULL;
  33. len = f;
  34. deque<INT> que1;
  35. deque<char> que2;
  36. //预处理
  37. for(int i = ;i < len-;++i)
  38. if(str[i] == '>' && str[i+] == '>' && str[i+] != '>')
  39. str[i] = str[i+] = '^';
  40. char ss[]; //缓存数字
  41. for(int i = ;i < len;++i)
  42. {
  43. if(str[i] == 'S' || str[i] == 's')
  44. {
  45. i++;
  46. que2.push_front('<');
  47. }
  48. if(str[i] == '>')
  49. {
  50. INT tt = *que1.begin();
  51. que1.pop_front();
  52. que2.pop_front(); //计算完后把'<'弹出来
  53. tt *= tt;
  54. tt %= MOD;
  55. if(*que2.begin() == '^')
  56. {
  57. INT tt2 = *que1.begin();
  58. que1.pop_front();
  59. que1.push_front(get_num(tt2,tt));
  60. que2.pop_front();
  61. }
  62. else que1.push_front(tt);
  63. }
  64. if(str[i] == '^')
  65. {
  66. i++;
  67. que2.push_front('^');
  68. }
  69. if(str[i] >= '' && str[i] <= '')
  70. {
  71. int ll = ;
  72. while(str[i] >= '' && str[i] <= '')
  73. {
  74. ss[ll++] = str[i];
  75. i++;
  76. }
  77. i--;
  78. ss[ll] = NULL;
  79. int tt = atoi(ss);
  80. if(*que2.begin() == '^')
  81. {
  82. int tt2 = *que1.begin();
  83. que1.pop_front();
  84. que2.pop_front();
  85. que1.push_front(get_num(tt2,tt)); //get_num计算tt2 >> tt之后压回到栈中
  86. }
  87. else que1.push_front(tt);
  88. }
  89. }
  90. while(!que2.empty())
  91. {
  92. if(*que2.begin() == '^')
  93. {
  94. que2.pop_front(); //现在只可能剩下^
  95. int tt1 = *que1.begin();
  96. que1.pop_front();
  97. int tt2 = *que1.begin();
  98. que1.pop_front();
  99. que1.push_front(get_num(tt2,tt1));
  100. }
  101. /* else if(*que2.begin() == '>')
  102. {
  103. INT tt = *que1.begin();
  104. que1.pop_front();
  105. tt *= tt;
  106. tt %= MOD;
  107. que1.push_front(tt);
  108. que2.pop_front();
  109. que2.pop_front();
  110. }*/
  111. }
  112. printf("%d\n",*que1.begin());
  113. que2.clear();
  114. que1.clear();
  115. }
  116. return ;
  117. }

HNU 12817 Shipura(表达式求值)的更多相关文章

  1. 表达式求值(noip2015等价表达式)

    题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...

  2. 用Python3实现表达式求值

    一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...

  3. 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

    一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

  4. nyoj305_表达式求值

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

  5. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

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

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

  7. NOIP2013普及组 T2 表达式求值

    OJ地址:洛谷P1981 CODEVS 3292 正常写法是用栈 #include<iostream> #include<algorithm> #include<cmat ...

  8. NOIP201302表达式求值

    NOIP201302表达式求值 题目描述 Description 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入描述 Input Description 输入仅有一行,为需要你计 ...

  9. OpenJudge计算概论-简单算术表达式求值

    /*===================================== 简单算术表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 2位正整数的简单算术运算(只考虑整数运 ...

随机推荐

  1. [转]Android Studio 快捷键整理分享

    Alt+回车 导入包,自动修正 Ctrl+N   查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L  格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+Insert 生成代码 ...

  2. Java死锁的例子

    死锁 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 导致死锁的根源在于不适当地运用“synchronized”关 ...

  3. [转载]VS2012编译C语言scanf函数error的解决方法

    在VS 2012 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误: error C4996: 'scanf': This function or variable may ...

  4. [转]Java总结篇系列:Java泛型

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(Stri ...

  5. SpringMVC实战

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...

  6. MySQL tips (日期时间操作/concat 等)

    1.  Query结尾要加一个分号: 2.  数据库和表 SHOW DATABASES;    USE YOUR_DB; SHOW TABLES; SHOW COLUMNS FROM study或者D ...

  7. poj2774 后缀数组 求最长公共子串

    Reference:IOI2009论文 http://www.cnblogs.com/ziyi--caolu/p/3192731.html #include "stdio.h" # ...

  8. urllib2.URLError: <urlopen error [Errno 10061] >

    今天来运行以前的python脚本,结果报这个错:urllib2.URLError: <urlopen error [Errno 10061] > 原来是因为 解决方法:打开IE浏览器,依次 ...

  9. python学习易错点1

    1.>>> d = {'x': 'A', 'y': 'B', 'z': 'C' } >>> for k, v in d.iteritems(): ... print ...

  10. eclipse中Preferences的一些设置

    1.在Eclipse里面设置了java文件保存时自动格式化,在java->Code Style->Formatter里设置了自定义的格式化的样式,这样每次保存后都会自动格式化代码,用了一段 ...