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<>这个之后要对符号栈的栈顶进行判断,如果是>>就要继续计算。

  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 = 1000000007;
 10 const int maxn = 2000000+5;
 11 char str[maxn],temp[maxn];
 12 int get_num(INT s,INT t)
 13 {
 14     for(int i = 0;i < t;++i)
 15     {
 16         s = s >> 1;
 17         if(s == 0)
 18         return 0;
 19     }
 20     return s;
 21 }
 22 int main()
 23 {
 24     while(gets(temp))
 25     {
 26         if(temp[0] == ‘#‘)
 27         break;
 28         int len = strlen(temp),f = 0;
 29         for(int i = 0;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 = 0;i < len-2;++i)
 38         if(str[i] == ‘>‘ && str[i+1] == ‘>‘ && str[i+2] != ‘>‘)
 39         str[i] = str[i+1] = ‘^‘;
 40         char ss[20];       //缓存数字
 41         for(int i = 0;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] >= ‘0‘ && str[i] <= ‘9‘)
 70             {
 71                 int ll = 0;
 72                 while(str[i] >= ‘0‘ && str[i] <= ‘9‘)
 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 0;
117 }

HNU 12817 Shipura(表达式求值)

时间: 2024-11-06 22:12:45

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

四则运算表达式求值 OpenJ_Bailian - 4132

四则运算表达式求值 OpenJ_Bailian - 4132 题意:设计一个计算器,实现+-*/以及()的表达式运算求值. 栈的应用,这学期学数据结构,手写了栈练一下~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=10010; //最大表达式长度 4 5 template <typename T> 6 class Stack; 7 8 template <typename T> 9

表达式求值

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,近期又学会了一些简单的函数求值,比方,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式. 如果表达式能够简单定义为: 1. 一个正的十进制数 x 是一个表达式. 2. 假设 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x

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

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

四则运算表达式求值の各种心碎

实验三---四则运算表达式求值 一.基本要求: ( 1 ) 利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值. ( 2) 输入输出格式: 输入格式:在字符界面上输入一个中缀表达式,回车表示结束. 请输入表达式: 输入一个中缀表达式 输出格式:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后 缀表达式中两相邻操作数之间利用空格隔开:如果不正确,在字符界面上输出表达式错误提示. 逆波兰表达式为: 输出逆波兰表达式 运算结果为:输出运算后的结果 测试数据

lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"]

使用逆波兰式进行表达式求值

中缀表达式及后缀表达式图解中说明了使用逆波兰式进行表达式求值的方法,这里使用C++进行实现.实现和原理讲解有一点不同,需要进一步进行细化. 关于将中缀表达式转换成后后缀表达式的规则: 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分:若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止. 上面的规则转换成下面的执行规则: 1.遇到操作数:直接输出(添加到后缀

序列点在C语言表达式求值中的作用

摘要: 本文开创性地分析了序列点在C语言表达式求值中的作用:序列点左边的操作数要先于其右边的操作数求值.讨论了逗号操作符,.逻辑与操作符&&.逻辑或操作符||和条件操作符?:的问号处需要序列点的原因.举例分析了序列点在表达式求值中的作用. 关键字:序列点 表达式求值 C语言 C语言作为一种主流程序设计语言,许多编程语言如Java.C++.C#都借鉴了它的语法.C语言也是一种很适当的程序设计入门的教学语言,国内大专院校的许多专业都开设了这门课程并且大多将其作为第一门程序设计语言课程,同时C语

【足迹C++primer】表达式求值

表达式求值 /** * 功能:表达式求值(0到9) * 时间:2014年6月15日08:02:31 * 作者:cutter_point */ #include<stdlib.h> #include<stack> #include<iostream> #include<string> using namespace std; stack<int> intStack; //存放数值的栈 stack<char> charStack; //存

C/C++ 语言中的表达式求值

蛱酝缒 C/C++ 语言中的表达式求值