数据结构--栈 codevs 1107 等价表达式
codevs 1107 等价表达式
2005年NOIP全国联赛提高组
明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。
这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?
这个选择题中的每个表达式都满足下面的性质:
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……
输入第一行给出的是题干中的表达式。第二行是一个整数n(2<=n<=26),表示选项的个数。后面n行,每行包括一个选项中的表达式。这n个选项的标号分别是A,B,C,D……
输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。
输出包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。
(a+1)^2
3
(a-1)^2+4*a
a+1+a
a^2+2*a*1+1^2+10-10+a-a
AC
【数据规模】
对于30%的数据,表达式中只可能出现两种运算符‘+’和‘-’;
对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。
对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。
/*
机智的方法:给a代入特殊值。不要代入0,1,-1这样的数。最好代质数。
只代入一个数还是很有可能出现两个不等的式子算出来结果相等。
多代几个数
还有一个问题,代数的话,计算结果可能会超过long long范围。
计算的时候记得模一个大质数
因为我们取了若干个数代进去,所以即使模了一个数冲突的几率也很小
下面进入正题:如何计算表达式的值?
我们需要开两个栈:一个用来存储数字,一个用来存储符号。
读入数字时,压入数字栈
读入符号时:
1.如果是运算符,当前栈顶的运算符优先级大于等于新运算符,则将栈顶运算符弹出,并将当前数字栈顶的两个数进行相应运算,弹出旧数,压入新结果。不停循环,直到栈里面没有符号或符号优先级低于当前新运算符。
2.如果是(,直接压入栈。
3.如果是),则依次将栈里面的符号弹出,并计算。直到遇到一个(。 */
#include<cstring>
#include<iostream>
using namespace std;
#include<cstdio>
#define mod 32767
#define max_len 10
#define L 55
char s[L],b[L],n;
int ans[max_len+];
int sumstack[L],fhstack[L];
int len1=,len2=;
int quick_mod(int x,int y)//x^y
{
int ret=;
while(y)
{
if(y&)
{
ret*=x;
ret%=mod;
}
y>>=;x*=x;
x%=mod;
}
return ret;
}
void multi()
{
switch(fhstack[len2])
{
case :sumstack[len1-]+=sumstack[len1];
sumstack[len1-]%=mod;
break;
case :sumstack[len1-]-=sumstack[len1];
sumstack[len1-]%=mod;
break;
case :sumstack[len1-]*=sumstack[len1];
sumstack[len1-]%=mod;
break;
case :sumstack[len1-]=quick_mod(sumstack[len1-],sumstack[len1]);
sumstack[len1-]%=mod;
break;
case :len2--; return;/*遇到左括号,直接跳过,是符号栈指针--*/
}
len1--;len2--;
}
int js(char s1[],int k)
{
memset(sumstack,,sizeof(sumstack));
memset(fhstack,,sizeof(fhstack));
sumstack[]=;len1=;
len2=;
int len=strlen(s1);
for(int i=;i<len;++i)
{
if(s1[i]==' ') continue;
if(s1[i]=='a')
{
sumstack[++len1]=k;
continue;
}
if(s1[i]>=''&&s1[i]<='')
{
sumstack[++len1]=s1[i]-'';
while(s1[i+]>=''&&s1[i+]<='')
{
sumstack[len1]=sumstack[len1]*+s1[i+]-'';
sumstack[len1]%=mod;
i++;
}
continue;
}
switch(s1[i])
{
case '(': fhstack[++len2]=;break;
case '+':while(len2>&&fhstack[len2]>&&fhstack[len2]<) multi();
fhstack[++len2]=;
break;
/*注意这里的是while,不是if,就是如果满足条件的话,就把前面的一直算*/
case '-':while(len2>&&fhstack[len2]>&&fhstack[len2]<) multi();
fhstack[++len2]=;
break;
case '*':while(len2>&&fhstack[len2]>&&fhstack[len2]<) multi();
fhstack[++len2]=;
break;
case '^':while(len2>&&fhstack[len2]>&&fhstack[len2]<) multi();
fhstack[++len2]=;
break;
case ')':while(len2>&&fhstack[len2]<) multi();
if(fhstack[len2]==) len2--;
break;
}
}
while(len2) multi();
if(len1==) return (sumstack[]+mod)%mod;
return (sumstack[]+mod)%mod;
}
int main()
{
gets(s);
for(int i=;i<max_len;++i)
ans[i]=js(s,i);
scanf("%d\n",&n);
for(int i=;i<=n;++i)
{
gets(b);
bool flag=true;
for(int i=;i<max_len;++i)
{
int x=js(b,i);
if(x!=ans[i])
{
flag=false;
break;
}
}
if(flag)
printf("%c",'A'-+i);
}
return ;
}
数据结构--栈 codevs 1107 等价表达式的更多相关文章
- codevs 1107 等价表达式
传送门 题解:第一眼这题好像非常难得样子,简直没有思路.但是这可以用栈带入特殊值来解决.这里用到两个栈,一个是存贮数字,另一个存贮运算符,按优先级进行运算.当读入的运算符比运算符栈的栈顶元素优先级低时 ...
- 等价表达式 2005年NOIP全国联赛提高组(栈模拟)
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷 P1054 等价表达式 解题报告
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- javascript使用栈结构将中缀表达式转换为后缀表达式并计算值
1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...
- 等价表达式(noip2005)
3.等价表达式 [问题描述] 兵兵班的同学都喜欢数学这一科目,中秋聚会这天,数学课代表给大家出了个有关代数表达式的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也 ...
- 数据结构——栈(C语言实现)
#include <stdio.h> #include <stdlib.h> #include<string.h> #include<malloc.h> ...
- C++ 泛型 编写的 数据结构 栈
平时编程里经常需要用到数据结构,比如 栈和队列 等, 为了避免每次用到都需要重新编写的麻烦现将 C++ 编写的 数据结构 栈 记录下来,以备后用. 将 数据结构 栈 用头文件的形式 ...
- 栈应用之 后缀表达式计算 (python 版)
栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1. 中缀表达式.前缀表达式.后缀表达式区别 中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...
- C语言数据结构-栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作
1.数据结构-栈的实现-C语言 #define MAXSIZE 100 //栈的存储结构 typedef struct { int* base; //栈底指针 int* top; //栈顶指针 int ...
随机推荐
- Unsupervised Classification - Sprawl Classification Algorithm
Idea Points (data) in same cluster are near each others, or are connected by each others. So: For a ...
- Maven创建webapp(二)
这一节将记录在myeclipse下用maven创建一个简单的webapp项目 web开发maven仓库自动添加组件,故需要需要保持网络的通畅. 打开myeclipse --> File - ...
- PHP学习笔记:利用百度api实现手机归属地查询
从来没有用过api,都不知道怎么获得api的数据,跟着demo,然后修改,终于实现了手机号码查询的功能,代码和说明很全,大家试试. <?php /** * Created by jianqing ...
- 【iOS】Quartz2D矩阵操作
前面画基本图形时,画四边形是由几条直线拼接成的,现在有更简便的方法. 一.关于矩阵操作 1.画一个四边形 通过设置两个端点(长和宽)来完成一个四边形的绘制. 代码: - (void)drawRect: ...
- mysql命令行备份数据库
MySQL数据库使用命令行备份|MySQL数据库备份命令 例如: 数据库地址:127.0.0.1 数据库用户名:root 数据库密码:pass 数据库名称:myweb 备份数据库到D盘跟目录 mysq ...
- Eclipse下Android开发的问题:Failed to install AndroidPhone.apk on device 'emulator-5554': timeout 解决办法
在window->preferences->Android->DDMS->ADB connection time out (ms): 将这个值设置的大一些,默认为5000,我设 ...
- Ideal-image-slider 幻灯片
在线实例 实例演示 默认效果 实例演示 淡入淡出 实例演示 带链接 实例演示 项目导航 实例演示 带标题描述 实例演示 回调函数 实例演示 自定义切换 使用方法 <div class=" ...
- 淡扯javascript编程思想
一.面向对象-OOD 虽然js面向对象的编程思想已经老话常谈了,但了为了文章的完整性,我还是把它加了进来,尽量以不太一样的方式讲述(虽然也没什么卵不一样的). 1.面向对象,首先得有类的概念,没有 ...
- [Android]Android Debug key 的制作
Android Debug key 的制作 背景 在Android App 开发过程中,我们经常会使用一些第三方的服务,但是很多的第三方服务都会要求我们提供包名,签名安装包,这时候,我们在日常调试时, ...
- Android环境的搭建
一.Java环境的配置(以JDK1.7为例) 在环境变量下查看,查看是否存在JAVA_HOME,没有的话新建一个 JAVA_HOME:java安装目录下jdk的安装目录 Path:jdk目录下面的bi ...