题目链接: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. PHP PC端接入支付宝和微信感悟

    想着中秋节的时候把异步线程学习完,同事说有个PHP的支付要帮忙做一下,虽然中秋节计划是把C#的异步学完,不过还是喜欢挑战,好久没有像大学一样这么认真的熬夜解决问题了.由于在大学学过asp,它和php有 ...

  2. 我给出的一份Java服务器端面试题-适合电话面试

    这部分内容,参考了<面试官的七种武器>一文. 电面与face2face的面试还是有区别的,很多考察方式无法使用. 从简历聊起,逐渐进入正题. Java语法 重载与重写的区别? java如何 ...

  3. 怎样将SQL Azure数据库备份到本地或者Storage

    怎样备份SQL Azure数据库到本地或者云存储Storage,可以使用SQL Database Import Export 的功能. 具体操作如下: 用SSMS链接SQL Azure数据库 注意:服 ...

  4. [USACO2005][POJ2226]Muddy Fields(二分图最小点覆盖)

    题目:http://poj.org/problem?id=2226 题意:给你一个字符矩阵,每个位置只能有"*"或者“.",连续的横着或者竖的“*"可以用一块木 ...

  5. Java 读取文件到字符串

    Java的io操作比较复杂 package cn.outofmemory.util; import java.io.BufferedReader; import java.io.FileInputSt ...

  6. hdu3746 KMP

    这题琢磨了挺长的时间.需要理解next[]表示了什么; next[i]代表了前缀和后缀的最大匹配的值,也就是个数. len-next[len]表示循环节的长度; 比如abcab   int fl=le ...

  7. note.js之 Nodejs+Express4在windows下的配置

    本篇主要介绍一下在windows平台下采用nodejs+express4框架+Mongodb实现网站的开发.其实本人是不赞同在Windows平台下使用node.js进行开发,但由于公司后台工程师都是采 ...

  8. Oracle 调度程序(scheduler)摘自一位大神

    在11g中,Oracle提供了一个新建的Scheduler特性,帮助将作业实现自动化.它还可以帮助你控制资源的利用与并可以将数据库中的作业按优先顺序执行.传统的dbms_jobs的一个限制是它只能调度 ...

  9. USACO 3.2 ratios 高斯消元

    题目原意很简单,就是解一个三元一次方程组 直接高斯消元解方程组,枚举最后一列的倍数(k) 注意double的精度,有很多细节需要处理 /* PROB:ratios LANG:C++ */ #inclu ...

  10. JSP业务逻辑层

    经典的三层架构:表示层.业务逻辑层和数据访问层 具体的区分方法 1:数据访问层:主要看你的数据层里面有没有包含逻辑处理,实际上他的各个函数主要完成各个对数据文件的操作.而不必管其他操作. 2:业务逻辑 ...