Java 二十四点
一、解题思路
1、先算乘除法
由题可知输入的表达式为标准的N-N-N-N形式,N为1~9的数字,-为运算符(加+,减-,乘法用英文小写字母x表示,除/)。可以用栈处理输入的表达式,按照运算符优先顺序,先算乘除再算加减,将数字压入数字栈,将+或-压入符号栈。
碰到x或/,取栈顶元素与下一个数字相乘或相除,再将结果压入栈作为新的栈顶元素,直到表达式处理完毕。
2、再算加减法得出最后结果
栈为后进先出,所以需要新建两个栈来做顺序加减,将数字栈(符号栈)栈顶元素依次压入新的数字栈(符号栈),直至原栈为空,然后按照新栈的出栈顺序计算最终结果。
二、栈的处理过程
以9+3+4x3为例:
1、先算乘除
数字栈 | 运算符栈 |
---|---|
9 | + |
3 | + |
4 | (此时乘法符号,不入栈) |
计算乘法,取栈顶元素4与下一元素相乘然后入栈) |
数字栈 | 运算符栈 |
---|---|
9 | + |
3 | + |
12 |
2、再算加减
1)如果符号栈不为空,即表达式中含有加减法
新数字栈 | 新符号栈 |
---|---|
12 | + |
3 | + |
9 |
先取数字栈栈顶元素,result=12;
新数字栈 | 新符号栈 |
---|---|
3 | + |
9 | + |
数字栈和符号栈同时出栈,根据符号栈栈顶元素判断做加法还是减法
result=result+3=15;
新数字栈 | 新符号栈 |
---|---|
9 | + |
result=result+9=24;
输出Yes。
2)如果符号栈为空,即表达式中全为乘除法,那么就不需要建立新栈,数字栈的元素就是最终结果。
三、代码如下:
package cf;
import java.util.Scanner;
import java.util.Stack;
public class Main24 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] sin = new String[n];
for (int t = 0; t < n; t++)
sin[t] = sc.next();
for (int t = 0; t < n; t++) {
String s = sin[t];
Stack<Integer> s1 = new Stack<Integer>();
Stack<Character> s2 = new Stack<Character>();
int f = 0;
boolean flag = true;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (flag) {
if ((c - '0') >= 1 && (c - '0') <= 9 ) {
s1.push(c - '0');
} else if (c == '+' || c == '-') {
s2.push(c);
} else if (c == 'x') {
f = 1;
flag = false;
} else if (c == '/') {
f = 2;
flag = false;
}
}
else if (flag == false&&f == 1) {
int temp = s1.pop();
int ttt = c - '0';
s1.push(temp * ttt);
f = 0;
flag = true;
}
else if (flag==false&&f == 2) {
int temp = s1.pop();
int ttt = c - '0';
s1.push(temp / ttt);
f = 0;
flag = true;
}
}
if (s2.isEmpty()) {
if (s1.pop() == 24)
System.out.println("Yes");
else
System.out.println("No");
} else {
Stack<Integer> st1 = new Stack<Integer>();
Stack<Character> st2 = new Stack<Character>();
while (s1.isEmpty() == false)
st1.push(s1.pop());
while (s2.isEmpty() == false)
st2.push(s2.pop());
int re = st1.pop();
while (st1.isEmpty() == false && st2.isEmpty() == false) {
char ct = st2.pop();
if (ct == '+') {
re += st1.pop();
} else if (ct == '-') {
re -= st1.pop();
}
}
if (re == 24)
System.out.println("Yes");
else
System.out.println("No");
}
}
}
}