数据结构--栈 codevs 1107 等价表达式

codevs 1107 等价表达式

2005年NOIP全国联赛提高组

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
题目描述 Description

明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。

这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?

这个选择题中的每个表达式都满足下面的性质:
1.表达式只可能包含一个变量‘a’。
2.表达式中出现的数都是正整数,而且都小于10000。
3.表达式中可以包括四种运算‘+’(加),‘-’(减),‘*’(乘),‘^’(乘幂),以及小括号‘(’,‘)’。小括号的优先级最高,其次是‘^’,然后是‘*’,最后是‘+’和‘-’。‘+’和‘-’的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符‘+’,‘-’,‘*’,‘^’以及小括号‘(’,‘)’都是英文字符)
4.幂指数只可能是1到10之间的正整数(包括1和10)。
5.表达式内部,头部或者尾部都可能有一些多余的空格。
下面是一些合理的表达式的例子:
((a^1)^2)^3,a*a+a-a,((a+a)),9999+(a-a)*a,1+(a-1)^3,1^10^9……

输入描述 Input Description

输入第一行给出的是题干中的表达式。第二行是一个整数n(2<=n<=26),表示选项的个数。后面n行,每行包括一个选项中的表达式。这n个选项的标号分别是A,B,C,D……

输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。

输出描述 Output Description

输出包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。

样例输入 Sample Input

(a+1)^2
3
(a-1)^2+4*a
a+1+a
a^2+2*a*1+1^2+10-10+a-a

样例输出 Sample Output

AC

数据范围及提示 Data Size & Hint

【数据规模】
对于30%的数据,表达式中只可能出现两种运算符‘+’和‘-’;
对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。
对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。

  1 /*
  2 机智的方法:给a代入特殊值。不要代入0,1,-1这样的数。最好代质数。
  3 只代入一个数还是很有可能出现两个不等的式子算出来结果相等。
  4 多代几个数
  5 还有一个问题,代数的话,计算结果可能会超过long long范围。
  6 计算的时候记得模一个大质数
  7 因为我们取了若干个数代进去,所以即使模了一个数冲突的几率也很小
  8 下面进入正题:如何计算表达式的值?
  9 我们需要开两个栈:一个用来存储数字,一个用来存储符号。
 10 读入数字时,压入数字栈
 11 读入符号时:
 12 1.如果是运算符,当前栈顶的运算符优先级大于等于新运算符,则将栈顶运算符弹出,并将当前数字栈顶的两个数进行相应运算,弹出旧数,压入新结果。不停循环,直到栈里面没有符号或符号优先级低于当前新运算符。
 13 2.如果是(,直接压入栈。
 14 3.如果是),则依次将栈里面的符号弹出,并计算。直到遇到一个(。
 15 
 16 */
 17 #include<cstring>
 18 #include<iostream>
 19 using namespace std;
 20 #include<cstdio>
 21 #define mod 32767
 22 #define max_len 10
 23 #define L 55
 24 char s[L],b[L],n;
 25 int ans[max_len+5];
 26 int sumstack[L],fhstack[L];
 27 int len1=0,len2=0;
 28 int quick_mod(int x,int y)//x^y
 29 {
 30     int ret=1;
 31     while(y)
 32     {
 33         if(y&1)
 34         {
 35             ret*=x;
 36             ret%=mod;
 37         }
 38         y>>=1;x*=x;
 39         x%=mod;
 40     }
 41     return ret;
 42 }
 43 void multi()
 44 {
 45     switch(fhstack[len2])
 46     {
 47         case 1:sumstack[len1-1]+=sumstack[len1];
 48                sumstack[len1-1]%=mod;
 49                break;
 50         case 2:sumstack[len1-1]-=sumstack[len1];
 51                sumstack[len1-1]%=mod;
 52                break;
 53         case 3:sumstack[len1-1]*=sumstack[len1];
 54                sumstack[len1-1]%=mod;
 55                break;
 56         case 4:sumstack[len1-1]=quick_mod(sumstack[len1-1],sumstack[len1]);
 57                sumstack[len1-1]%=mod;
 58                break;
 59         case 5:len2--; return;/*遇到左括号,直接跳过,是符号栈指针--*/
 60     }
 61     len1--;len2--;
 62 }
 63 int js(char s1[],int k)
 64 {
 65     memset(sumstack,0,sizeof(sumstack));
 66     memset(fhstack,0,sizeof(fhstack));
 67     sumstack[1]=0;len1=1;
 68     len2=0;
 69     int len=strlen(s1);
 70     for(int i=0;i<len;++i)
 71     {
 72         if(s1[i]==' ') continue;
 73         if(s1[i]=='a')
 74         {
 75             sumstack[++len1]=k;
 76             continue;
 77         }
 78         if(s1[i]>='0'&&s1[i]<='9')
 79         {
 80             sumstack[++len1]=s1[i]-'0';
 81             while(s1[i+1]>='0'&&s1[i+1]<='9')
 82             {
 83                 sumstack[len1]=sumstack[len1]*10+s1[i+1]-'0';
 84                 sumstack[len1]%=mod;
 85                 i++;
 86             }
 87             continue;
 88         }
 89         switch(s1[i])
 90         {
 91             case '(': fhstack[++len2]=5;break;
 92             case '+':while(len2>0&&fhstack[len2]>0&&fhstack[len2]<5) multi();
 93                      fhstack[++len2]=1;
 94                      break;
 95 /*注意这里的是while,不是if,就是如果满足条件的话,就把前面的一直算*/
 96             case '-':while(len2>0&&fhstack[len2]>0&&fhstack[len2]<5) multi();
 97                      fhstack[++len2]=2;
 98                      break;
 99             case '*':while(len2>0&&fhstack[len2]>2&&fhstack[len2]<5) multi();
100                      fhstack[++len2]=3;
101                      break;
102             case '^':while(len2>0&&fhstack[len2]>3&&fhstack[len2]<5) multi();
103                      fhstack[++len2]=4;
104                      break;
105             case ')':while(len2>0&&fhstack[len2]<5) multi();
106                      if(fhstack[len2]==5) len2--;
107                      break;
108         }
109     }
110     while(len2) multi();
111     if(len1==1) return (sumstack[1]+mod)%mod;
112     return (sumstack[2]+mod)%mod;
113 }
114 int main()
115 {
116     gets(s);
117     for(int i=1;i<max_len;++i)
118       ans[i]=js(s,i);
119     scanf("%d\n",&n);
120     for(int i=1;i<=n;++i)
121     {
122         gets(b);
123         bool flag=true;
124         for(int i=1;i<max_len;++i)
125         {
126             int x=js(b,i);
127             if(x!=ans[i])
128             {
129                 flag=false;
130                 break;
131             }
132         }
133         if(flag) 
134           printf("%c",'A'-1+i);
135     }
136     return 0;
137 }

 

转载于:https://www.cnblogs.com/c1299401227/p/5767231.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标检测的图像特征提取之(二)LBP特征

LBP特征实质是&#xff1a;图像局部特征的提取 意义&#xff1a;纹理的提取 http://blog.csdn.net/zouxy09/article/details/7929531 1&#xff09;首先将检测窗口划分为1616的小区域&#xff08;cell&#xff09;&#xff1b; &#xff08;2&#xff09;对于每个cell中的一个…

VS2010安装帮助文档出现错误

安装VS2010后的帮助文档安装出现错误:未能在指定文件夹中创建本地存储区 安装完VS2010后&#xff0c;出现错误&#xff0c;取消后 再安装MSDN 打开“Help Library 管理器 - Microsoft Help 查看器 1.0” 提示“请为本地内容选择位置” 默认的位置是在“C:\Documents and Settin…

matlab smulink笔记03——过零检测

★过零检测 变步长解算方法动态地评估计算下一个采样时刻所使用的步长&#xff0c;当前后两个采 样点的状态值变化大时&#xff0c;则缩小采样步长&#xff0c;当前后两个采样点的值变化小时则增大步 这种做法使得解算器在计算不连续临近区域时使用较小的步长&#xff0c;因为不…

电脑下乡的遐想

最近讨论家电下乡的话题很热&#xff0c;其中我个人最关心“电脑下乡”。原因是&#xff0c;我是农村人&#xff0c;正好在电脑相关行业里混。 应当说&#xff0c;让电脑下乡是我多年的梦想&#xff0c;我多么盼望乡下的乡亲们能够上网看新闻、学习、看电视……但是&#xff0c…

angularjs学习曲线

angularjs学习曲线 刚开始学Augular觉得开发应用需要有相当的编程基础. 不得不说这确实是一款了不起的开发框架&#xff0c;它要求开发人员设计低耦合和可维护的应用. 使用AngularJS 的复杂度就像使用PHP&#xff0c;Ruby on Rails等等, 都需要处理依赖注入&#xff0c;路由&am…

HttpWebRequest post上传文件

public static string HttpUploadFile(string url, string path){// 设置参数 HttpWebRequest request WebRequest.Create(url) as HttpWebRequest;CookieContainer cookieContainer new CookieContainer();request.CookieContainer cookieContainer;request.AllowAutoRedir…

文章标题

**1>MSVCRTD.lib(exe_main.obj) : error LNK2019: 无法解析的外部符号 main&#xff0c;该符号在函数 “int __cdecl invoke_main(void)” (?invoke_mainYAHXZ) 中被引用 1>D:\vs2015-code\Imae_Client\x64\Debug\Imae_Client.exe : fatal error LNK1120: 1 个无法解析…

matlab simulink笔记04——switch模块

Switch 模块 Switch模块是-.个选择开关模块,可根据判断条件选择多个输入端口中的某个进行输出。图所示为CommonlyUsedBlocks中具有3个输入端口.1个输出端口的Switch模块图标。模块的3个端口中,第1个和第3个端口为输出端口提供输出值,输出端口输出第1个输人口还是第3个输人口的值…

[Ajax]ajax学习与理解

1.新建demo.aspx页面。2.首先在该页面的后台文件demos.aspx.cs中添加引用。 using System.Web.Services;3.无参数的方法调用. 大家注意了&#xff0c;这个版本不能低于.net framework 2.0。2.0已下不支持的。后台代码&#xff1a; [WebMethod] public static string SayHel…

优化Web网站性能

一、前端优化网站性能优化是一个很综合的话题&#xff0c;涉及到服务器的配置和网站前后端程序等各个方面&#xff0c;我只是从实际经历出发&#xff0c;分享一下自己所尝试过的网站性能优化方法。之所以在标题上挂一个web2.0&#xff0c;是因为本文更偏重于中小网站的性能优化…

Gym - 100851F Froggy Ford kruskal

题目链接&#xff1a; http://acm.hust.edu.cn/vjudge/problem/307216Froggy FordTime Limit: 3000MS题意 青蛙过河&#xff0c;河中有若干个石头&#xff0c;现在你可以加一个石头&#xff0c;使得青蛙从左岸跳到右岸的最大跳跃距离最小。 题解 把左岸和右岸作为两个虚节点&am…

Tesseract入门-VS2015下调用Tesseract4.0 +win7 64位系统

本文是基于最近的OCR识别项目学习ocr开源库-tesseract的简单调用&#xff0c;不涉及其余视觉知识。 参考文献&#xff1a;http://blog.csdn.net/u012566751/article/details/54136836 参考库&#xff1a;http://download.csdn.net/download/u010554381/10044876 1.预备工作 …

authconfig命令解析_学习笔记

时间&#xff1a;2017.11.16作者&#xff1a;李强参考&#xff1a;man,info&#xff0c;magedu讲义声明&#xff1a;以下英文纯属个人翻译&#xff0c;英文B级&#xff0c;欢迎纠正&#xff0c;盗版不纠,才能有限&#xff0c;希望不误人子弟为好。1、使用目的与场景先列在这里&…

matlab simulinK笔记06——代数环

★代数环 代数环,就是由于模型的输出反馈到模块或子系统的某个输入端&#xff0c;如果这个输入 是直接馈入的&#xff0c;那么二者在同一个采样点内需得到求解&#xff0c;但又互相依赖,哪一方都不 能完成求解过程&#xff0c;使得解算器无法解算导致错误产生&#xff0c;这样的…

PHP多种序列化/反序列化的方法 (转载)

1. serialize和unserialize函数 这两个是序列化和反序列化PHP中数据的常用函数。 <?php$a array(a > Apple ,b > banana , c > Coconut);//序列化数组 $s serialize($a); echo $s; //输出结果&#xff1a;a:3:{s:1:"a";s:5:"Apple";s:1:&qu…

基于python3的Opencv(一)-打开摄像头显示图像

基于Python3的Opencv学习&#xff1a; import cv2 as cv def video_demo(): #0是代表摄像头编号&#xff0c;只有一个的话默认为0capturecv.VideoCapture(0) while(True):ref,framecapture.read()cv.imshow("1",frame) #等待30ms显示图像&#xff0c;若过程中按“Esc…

.Net中的AOP系列之《方法执行前后——边界切面》

返回《.Net中的AOP》系列学习总目录 本篇目录 边界切面 PostSharp方法边界方法边界 VS 方法拦截ASP.NET HttpModule边界真实案例——检查是否为移动端用户真实案例——缓存小结本系列的源码本人已托管于Coding上&#xff1a;点击查看。 本系列的实验环境&#xff1a;VS 2013 Up…

matlab simulink笔记06 —— 利用simulink求解微分方程/simulink框图与控制系统框图的区别

目录 1.利用integrator求解微分方程 1.1求解步骤 1.2例子 2.simulink框图与控制系统框图的区别 本人刚开始学习simulink,总是会将simulink框图和控制系统框图混淆,导致最后不能正确的根据simulink框图得到相应的微

ubuntu搭建svn、git遇到的问题及解决办法

不错的git笔记博客&#xff1a; http://www.cnblogs.com/wanqieddy/category/406859.html http://blog.csdn.net/zxncvb/article/details/22153019 Git学习教程&#xff08;六&#xff09;Git日志 http://fsjoy.blog.51cto.com/318484/245261/ 图解git http://my.oschina.net/x…

PHP IDE phpstorm 快捷键

这篇文章主要介绍了PHP IDE phpstorm 常用快捷键,本文分别列出了mac系统和Windows系统下的phpstorm快捷键,需要的朋友可以参考下 一、mac电脑phpstorm快捷键 command a 全选 command c 复制 command v 粘贴 command z 撤消 command k 代码搜索 command l 输入行号跳到某一…