HNU 12817 Shipura(表达式求值)
题目链接: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(表达式求值)的更多相关文章
- 表达式求值(noip2015等价表达式)
题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...
- 用Python3实现表达式求值
一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- nyoj305_表达式求值
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 数据结构--栈的应用(表达式求值 nyoj 35)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...
- NOIP2013普及组 T2 表达式求值
OJ地址:洛谷P1981 CODEVS 3292 正常写法是用栈 #include<iostream> #include<algorithm> #include<cmat ...
- NOIP201302表达式求值
NOIP201302表达式求值 题目描述 Description 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入描述 Input Description 输入仅有一行,为需要你计 ...
- OpenJudge计算概论-简单算术表达式求值
/*===================================== 简单算术表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 2位正整数的简单算术运算(只考虑整数运 ...
随机推荐
- [C/C++基础] C语言常用函数sprintf和snprintf的使用方法
Sprintf 函数声明:int sprintf(char *buffer, const char *format [, argument1, argument2, …]) 用途:将一段数据写入以地址 ...
- ORCHARD中文文档(翻译)
众所周知,Orchard是.net领域最好的开源CMS之一,他使用了微软最先进的技术,有一群先进理念的支持者,但是,所有的事情在国内总得加个但是,Orchard也不例外,中文资料相对比较少,官网提供的 ...
- 温故知新---重读C#InDepth(一)
一本好书,或是一本比较有深度的书,就是每次研读的时候都会有新的发现. 好吧,我承认每次读的时候都有泛泛而过的嫌疑~~ 这几年一直专注于C#客户端的开发,逐步从迷迷糊糊,到一知半解,再到自以为是,最后沉 ...
- JavaScript事件---事件对象
发文不易,若转载传播,请亲注明出处,谢谢! 内容提纲: 1.事件对象 2.鼠标事件 3.键盘事件 4.W3C与IE JavaScript事件的一个重要方面是它们拥有一些相对一致的特点,可以给你的开 ...
- jQuery应用之(二)使用jQuery管理选择结果(荐)
使用jQuery选择出来的元素与数组非常类似,可以通过jQuery提供的一系列方法对其进行处理,包括长度.查找某个元素,截取某个段落等. 1.获取元素的个数. 在jQuery中可以通过size()方法 ...
- nonatomic, retain,weak,strong用法详解
strong weak strong与weak是由ARC新引入的对象变量属性 ARC引入了新的对象的新生命周期限定,即零弱引用.如果零弱引用指向的对象被deallocated的话,零弱引用的对象会被自 ...
- zabbix_agent安装(Centos+Ubuntu)
Centos安装 安装依赖包 yum -y install mysql-devel libcurl-devel net-snmp-devel 添加用户 groupadd zabbix use ...
- Cocos2d-X3.0 刨根问底(八)----- 场景(Scene)、层(Layer)相关源码分析
本章节我们重点分析Cocos2d-x3.0与 场景.层相关的源码.这部分源码集中在 libcocos2d –> layers_scenes_transitions_nodes目录下面 我先发个截 ...
- PHP中GD2的运用,注意编码格式的改变,以及head()函数之前不能有任何html元素包括空格!!!
<?php header ( "Content-type: text/html; charset=utf-8" ); //设置文件编码格式 header("Cont ...
- 检验php用时
<?php// 实例1 /** * @start time */function proStartTime() { global $startTime; $mtime1 = explode(&q ...