PQJ  1686(栈栈栈)

用栈解决问题

Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u

Description

A math instructor is too lazy to grade a question in the exam papers in which students are supposed to produce a complicated formula for the question asked. Students may write correct answers in different forms which makes grading very hard. So, the instructor needs help from computer programmers and you can help.

You are to write a program to read different formulas and determine whether or not they are arithmetically equivalent.

Input

The first line of the input contains an integer N (1 <= N <= 20) that is the number of test cases. Following the first line, there are two lines for each test case. A test case consists of two arithmetic expressions, each on a separate line with at most 80 characters. There is no blank line in the input. An expression contains one or more of the following:

  • Single letter variables (case insensitive).
  • Single digit numbers.
  • Matched left and right parentheses.
  • Binary operators +, - and * which are used for addition, subtraction and multiplication respectively.
  • Arbitrary number of blank or tab characters between above tokens.

Note: Expressions are syntactically correct and evaluated from left to right with equal precedence (priority) for all operators. The coefficients and exponents of the variables are guaranteed to fit in 16-bit integers. 

Output

Your program must produce one line for each test case. If input expressions for each test data are arithmetically equivalent, "YES", otherwise "NO" must be printed as the output of the program. Output should be all in upper-case characters.

Sample Input

3
(a+b-c)*2
(a+a)+(b*2)-(3*c)+c
a*2-(a+c)+((a+c+e)*2)
3*a+c+(2*e)
(a-b)*(a-b)
(a*a)-(2*a*b)-(b*b)

Sample Output

YES
YES
NO

题意:

给出两个数学式子判断其结果是否相等。
解法:
1,用栈将表达式转换成为后缀式,然后计算后缀表达式的只判断其是否相等。
2,字母转换之后算其值来代表其字母的值,直接将其ASCII作为数值对待,这个题只是判断两个表达式是否在数值上是等价的而不是判断两个公式是否等价,一直很疑惑,查了一下发现比如说:(b-a+c)*2 与 (1+c)*2也相等,但是如果作为公式的话这两个是不相等的.

3.从程序看出,要先判断字符(juge),然后依次输入(in),然后计算出(put),最后输出(out)结果。

4.注意格式,空格或tab!

经过一番搜寻加完善的AC代码:

#include<iostream>
#include<fstream>
#include<stack>
#include<cstring>
#include<map>
using namespace std;
char c1[],c2[];
char s1[],s2[],s[];
int a[];
int juge(char c) //判断
{
if(c>=''&&c<='') return ;
if(c>='a'&&c<='z') return ;
else return ;
}
void in(char c[]) //输入
{
int i,j=;
stack<char> q;
for(i=;i<strlen(c);i++)
{
if(juge(c[i]))
s[j++]=c[i];
else if(c[i]=='(')
q.push(c[i]);
else if(c[i]==')')
{
while(q.top()!='(')
{
s[j++]=q.top();
q.pop();
}
q.pop();
}
else
if(c[i]=='+'||c[i]=='-'||c[i]=='*')
{
while(!q.empty()&&a[c[i]]<=a[q.top()])
{
s[j++]=q.top();
q.pop();
}
q.push(c[i]);
}
}
while(!q.empty())
{
s[j++]=q.top();
q.pop();
}
s[j]='\0'; //特别注意,很容易遗漏
} int put(char s1[]) //计算出值
{
int i,j,k;
stack<int> q;
for(i=;i<strlen(s1);i++)
{
if(juge(s1[i]))
{
if(s1[i]>=''&&s1[i]<='')
q.push(s1[i]-'');
else
q.push(s1[i]);
}
else
{
j=q.top();
q.pop();
k=q.top();
q.pop();
if(s1[i]=='+')
j=j+k;
if(s1[i]=='-')
j=k-j;
if(s1[i]=='*')
j=k*j;
q.push(j);
}
}
return q.top(); }
void out() //输出比较
{
a['+']=;
a['-']=;
a['*']=;
a['(']=;
int i,j,t;
cin>>t;
getchar();
while(t--){
cin.getline(c1,);
cin.getline(c2,);
in(c1);
strcpy(s1,s);
in(c2);
strcpy(s2,s);
i=put(s1);
j=put(s2);
if(i==j) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
} int main()
{
out();
return ;
}

PQJ 1686(栈栈栈)的更多相关文章

  1. C++中栈的出栈,入栈规则:A,B,C,D,E

    考题: 栈底至栈顶一次存放元素 ABCD 在第五个元素E入栈之前  栈中元素可以出栈,则出栈序列可能是_____a d___________. a.  ABCED b.  DBCEA   c.  CD ...

  2. 出栈入栈动画demo

    项目做了一个切换界面动画的功能,用到了出栈入栈的,写了一个demo package com.myron.stackview; import java.util.Stack; import androi ...

  3. C语言实现链栈的初始化&进栈&出栈&读取栈顶元素

    /*链表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typede ...

  4. C语言实现顺序栈的初始化&进栈&出栈&读取栈顶元素

    /*顺序表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define Stack_Size 50 //设栈中元素个数为50 ...

  5. 剑指Offer 20. 包含min函数的栈 (栈)

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 题目地址 https://www.nowcoder.com/practice/4c77 ...

  6. 顺序栈,链栈,队列java实现

    顺序栈 /** * 顺序栈 * */ public class SqStack { //栈的大小 private int maxSize; //栈顶指针 private int top; privat ...

  7. BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...

  8. BZOJ3772精神污染——可持久化线段树+出栈入栈序

    题目描述 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户 ...

  9. c++实验4 栈及栈的应用+回文+中、后缀表达式

    栈及栈的应用+回文+中.后缀表达式 1.栈顺序存储结构的基本操作算法实现 (1)栈顺序存储结构的类定义: class SeqStack { private: int maxsize; DataType ...

随机推荐

  1. Vagrant虚拟机的配置管理

    Vagrant虚拟机的配置管理 一.shell配置管理 二.使用Puppet进行配置管理 三.案例 Apache服务器的自动配置 3.1 shell配置管理 3.2 puppet配置管理 ps:由于最 ...

  2. Jenkins 十: 访问控制

    1. 打开“系统管理” –> “Configure Global Security”. 2.  选中“启用安全”. 3. 找到“安全域”,选中“Jenkins专有数据库”,选中“允许用户注册”. ...

  3. Jenkins 一: 环境安装以及配置

    安装JDK 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html 选择的JDK版本和开发使用的JDK版本最好 ...

  4. Java实现人民币大写代码解析

    想要实现人民币大写,在发票等场景中使用?? 1234.56显示为:壹仟贰佰叁拾肆元伍角陆分,那就往下看看吧! 本程序可以实现 0 到 9999 9999 9999.994 以内的人民币大写转换,精确到 ...

  5. set和replace方法的区别

    对已有值的元素处理上两者是相同的,但是对于一个不存在的元素,set的作用就和add相当,replace则是只能对已经存在的元素进行处理如:表中某个字段值是空(null),如果某个字段为空,则通过查询方 ...

  6. table头部、尾部固定;中间内容定高自适应滚动

    table头部.尾部固定;中间内容定高自适应滚动 很多时候,需要使用到表格做数据分析,不管是前端展现,还是后台管理系统节点展现 工作过程中遇到了,作为一个小笔记,备忘! 如下图所示 --------- ...

  7. java 获取黑屏信息保存在list中,截取字符执行

    ArrayList<String> list1 = new ArrayList<String>(); Process p = Runtime.getRuntime().exec ...

  8. 整理Git的命令使用

    Git是一个开源的分布式版本号控制系统,用以有效.快速的处理从非常小到非常大的项目版本号管理.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源代码的版本号 ...

  9. 根据IP地址获取IP的详细信息

    <?php header('Content-Type:text/html; charset=utf-8'); function ip_data() { $ip = GetIP(); $url = ...

  10. noip 2015 运输计划 (lca+二分)

    /* 95 最后一个点T了 qian lv ji qiong 了 没学过树剖 听chx听xzc说的神奇的方法 Orz 首先求出每个计划的路径长度 这里写的倍增 然后二分答案 对于每个ans 统计> ...