题目链接: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. 解决jquery $符号的冲突

    今天做项目的时候,写了一个ajax提交的js函数,然后在js调试的时候,提示发现 $.ajax ,前面的$ 符号不见了,通过网上搜索找到了下面的解决方法 jQuery中需要用到$符号,如果其他js库也 ...

  2. 最新微信小程序(应用号)视频教程,实战教程

    1.1课程介绍,定个小目标            http://v.youku.com/v_show/id_XMTc2NzIwNDk1Ng==.html 1.2开发文档简读,了解全貌       ht ...

  3. VS类自定义版权注释

    对IDE快捷方式右键-属性-打开文件位置,找到..\Microsoft Visual Studio 10.0\Common7\IDE文件夹下的..\ItemTemplates\CSharp\Code\ ...

  4. ajax请求模拟登录

    前台 @if (Session["username"] != null) { <div class="login"> <span style= ...

  5. 要期末了搞不了OI了额……

    TAT~~~~~~期中完挂,求RP求期末逆袭

  6. Bootstrap3.0学习第二十一轮(JavaScript插件——工具提示)

    详情请查看http://aehyok.com/Blog/Detail/27.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  7. solr导入mysql数据库

    感谢ITeye的博主viskyzz分享的经验,笔者基本参考ta的方法.然而,解决中间出现的问题时也融入了自己的经验. 查看ta的原文请戳: http://tbwuming.iteye.com/blog ...

  8. Java-ArrayList

    package 集合类.list类; /** * System.Collections.ArrayList类是一个特殊的数组.通过添加和删除元素,就可以动态改变数组的长度. 一.优点 1.支持自动改变 ...

  9. 【poj1090】 Chain

    http://poj.org/problem?id=1090 (题目链接) 题意 给出九连环的初始状态,要求将环全部取下需要走多少步. Solution 格雷码:神犇博客 当然递推也可以做. 代码 / ...

  10. BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 7390  Solved: 3122 [Submit][S ...