题目大意:判断两个表达式是否相等。
思路:这里给出两种方法。。。java的javax.script这个类非常好用啊(⊙o⊙)…可以直接计算出表达式的值,每个字母代入数据就好了~~用栈就是中缀表达式转后缀表达式~~
开辟两个栈,原表达式从左往右扫描。
1.若是数字,压入第一个栈。
2.若是运算符号,压入第二个栈,压入前,把所有优先级大于等于该运算符的运算符依次从栈顶取出来,取第一个栈中的数字进行运算,并将结果重新压入。
3.若是左括号,则压入第二个栈。
4.若是右括号,则依次取出第二个栈中的运算符进行计算,直到遇到左括号并将其弹出。
重复以上步骤直到将表达式扫描完~详情看代码~代码不长。
数据若,给字母赋值即可~~~若不放心,则赋值三次(字母个数),即可。
AC代码:(栈,后缀表达式)
import java.util.Scanner;
public class Main
{
static Scanner scan=new Scanner(System.in);
private static int cal(String s)
{
char a[]=s.toCharArray();
int stack1[]=new int[a.length],stack2[]=new int[a.length];
int pop1=0,pop2=0;
for(int i=0;i<a.length;i++)
{
if('0'<=a[i] && a[i]<='z')
stack2[pop2++]=a[i]-48;
else if(a[i]=='(')
stack1[pop1++]=a[i];
else if(a[i]==')')
{
while(stack1[pop1-1]!='(')
{
int x=stack2[--pop2],y=stack2[--pop2],z=stack1[--pop1];
stack2[pop2++]=(z=='*')?y*x:(z=='/')?y/x:(z=='+')?y+x:y-x;
}
pop1--;
}
else
{
while(pop1>0 && stack1[pop1-1]!='(' && pop2>1)
{
if(a[i]=='+' || a[i]=='-')
{
int x=stack2[--pop2],y=stack2[--pop2],z=stack1[--pop1];
stack2[pop2++]=(z=='*')?y*x:(z=='/')?y/x:(z=='+')?y+x:y-x;
}
else
{
if(stack1[pop1-1]!='*' || stack1[pop1-1]!='/')
break;
else
{
int x=stack2[--pop2],y=stack2[--pop2],z=stack1[--pop1];
stack2[pop2++]=(z=='*')?y+x:y/x;
}
}
}
stack1[pop1++]=a[i];
}
}
while(pop2>1)
{
int x=stack2[--pop2],y=stack2[--pop2],z=stack1[--pop1];
stack2[pop2++]=(z=='*')?y*x:(z=='/')?y/x:(z=='+')?y+x:y-x;
}
return stack2[0];
}
public static void main(String[] args)
{
int n=scan.nextInt();
scan.nextLine();
while(n-->0)
System.out.println(cal(scan.nextLine().replace(" ",""))==
cal(scan.nextLine().replace(" ",""))?"YES":"NO");
}
}
AC代码:(javax)
import java.util.Scanner;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Main
{
static Scanner scan=new Scanner(System.in);
static ScriptEngineManager factory=new ScriptEngineManager();
static ScriptEngine engine=factory.getEngineByName("JavaScript");
public static void main(String[] args)throws ScriptException
{
int n=scan.nextInt();
String s1=scan.nextLine(),s2;
while (n-->0)
{
s1=scan.nextLine();
s2=scan.nextLine();
for(char i='a';i<='z';i++)
{
s1=s1.replace(""+i,String.valueOf((int)i));
s2=s2.replace(""+i,String.valueOf((int)i));
}
System.out.println(engine.eval(s1).equals(engine.eval(s2))?"YES":"NO");
}
}
}