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

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

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

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<deque>
#include<cstdlib>
using namespace std;
typedef long long INT;
const INT MOD = ;
const int maxn = +;
char str[maxn],temp[maxn];
int get_num(INT s,INT t)
{
for(int i = ;i < t;++i)
{
s = s >> ;
if(s == )
return ;
}
return s;
}
int main()
{
while(gets(temp))
{
if(temp[] == '#')
break;
int len = strlen(temp),f = ;
for(int i = ;i < len; ++i)
if(temp[i] != ' ')
str[f++] = temp[i];
str[f] = NULL;
len = f;
deque<INT> que1;
deque<char> que2;
//预处理
for(int i = ;i < len-;++i)
if(str[i] == '>' && str[i+] == '>' && str[i+] != '>')
str[i] = str[i+] = '^';
char ss[]; //缓存数字
for(int i = ;i < len;++i)
{
if(str[i] == 'S' || str[i] == 's')
{
i++;
que2.push_front('<');
}
if(str[i] == '>')
{
INT tt = *que1.begin();
que1.pop_front();
que2.pop_front(); //计算完后把'<'弹出来
tt *= tt;
tt %= MOD;
if(*que2.begin() == '^')
{
INT tt2 = *que1.begin();
que1.pop_front();
que1.push_front(get_num(tt2,tt));
que2.pop_front();
}
else que1.push_front(tt);
}
if(str[i] == '^')
{
i++;
que2.push_front('^');
}
if(str[i] >= '' && str[i] <= '')
{
int ll = ;
while(str[i] >= '' && str[i] <= '')
{
ss[ll++] = str[i];
i++;
}
i--;
ss[ll] = NULL;
int tt = atoi(ss);
if(*que2.begin() == '^')
{
int tt2 = *que1.begin();
que1.pop_front();
que2.pop_front();
que1.push_front(get_num(tt2,tt)); //get_num计算tt2 >> tt之后压回到栈中
}
else que1.push_front(tt);
}
}
while(!que2.empty())
{
if(*que2.begin() == '^')
{
que2.pop_front(); //现在只可能剩下^
int tt1 = *que1.begin();
que1.pop_front();
int tt2 = *que1.begin();
que1.pop_front();
que1.push_front(get_num(tt2,tt1));
}
/* else if(*que2.begin() == '>')
{
INT tt = *que1.begin();
que1.pop_front();
tt *= tt;
tt %= MOD;
que1.push_front(tt);
que2.pop_front();
que2.pop_front();
}*/
}
printf("%d\n",*que1.begin());
que2.clear();
que1.clear();
}
return ;
}

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. 一个简单js select插件

    现在,通过一个select插件,来介绍一下js插件的构建过程. 1.先上效果图 2.目录构建 (1)这个select插件,我给它起名交hongselect,所以呢,首先建个hongselect的文件夹 ...

  2. Bootstrap系列 -- 39. 导航条添加标题

    在Web页面制作中,常常在菜单前面都会有一个标题(文字字号比其它文字稍大一些),其实在Bootstrap框架也为大家做了这方面考虑,其通过“navbar-header”和“navbar-brand”来 ...

  3. [USACO2004][poj1985]Cow Marathon(2次bfs求树的直径)

    http://poj.org/problem?id=1985 题意:就是给你一颗树,求树的直径(即问哪两点之间的距离最长) 分析: 1.树形dp:只要考虑根节点和子节点的关系就可以了 2.两次bfs: ...

  4. 第三章:javascript: 列表

    在日常生活中,人们经常使用列表:待办事项列表,购物清单,十佳榜单,最后十名榜单等.计算机也在使用列表,尤其是列表中元素保存的是太多时.当不需要一个很长的序列中查找元素,或对其进行排序时,列表显得尤为有 ...

  5. AngularJS-入门篇

    AngularJS是什么? 既然能找到这篇日志,证明大家已经了解AngularJS了我这里也就不长篇大论的说了. 其实AngularJS就是,使用JavaScript编写的客户端技术.和Web技术( ...

  6. Linq 分页不可缺少的两个方法

    //LINQ分页的方法 //1.获取总页数 public int GetPageCount(int pageSize)//pageSize是每页的行数 { //先查出总共有多少行 int rowCou ...

  7. NOI2005维修数列 splay

    好题,错了不知道多少遍.这题其他几个操作都是比较经典的,多了一个最大子序列的.这时候对于当前的区间,最大子序列,可能使左区间的最值,可能是右区间的最值,也可能是整个区间的.所以维护lx[],rx[], ...

  8. 缓存插件 EHCache 对象缓存(Spring)

    对象缓存就是将查询的数据,添加到缓存中,下次再次查询的时候直接从缓存中获取,而不去数据库中查询. 对象缓存一般是针对方法.类而来的,结合Spring的Aop对象.方法缓存就很简单.这里需要用到切面编程 ...

  9. BZOJ-1927 星际竞速 最小费用最大流+拆点+不坑建图

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MB Submit: 1593 Solved: 967 [Submit][Statu ...

  10. on the way to Peking University

    明天就要去北京参加北大夏令营了,希望这次能有所斩获! on the way to Peking University