问题如下:我写的只能得到30分,求大神指点!我的代码如下:import java.util.Scanner;public class 二十四点 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
String strs[] = new String[n];
for(int i = 0;i < n;i++) {
strs[i] = s.next();
}
for (int j = 0; j < n;j++){
if(calc(strs[j]) == 24){
System.out.println("Yes");
}else {
System.out.println("No");
}
}
}
public static int calc(String str){
int res = 0;
char chars[] = str.toCharArray();
//中缀表达式转后缀表达式
Stack stack = new Stack(10);
String postfix = "";
for (int i=0;i<chars.length;i++){
if (chars[i] > '9' || chars[i] < '0'){ //只要不是数字必定是操作符 操作符要出栈到“小于”当前操作符优先级
while (stack.peek()=='x' || stack.peek()=='/'){
postfix +=stack.pop();
}
stack.push(chars[i]);
}
else{
postfix += chars[i];
}
}
while (!stack.isEmpty()){
postfix += stack.pop();
}
//计算后缀表达式
Stack calcStack = new Stack(10);
char postfixs[] = postfix.toCharArray();
for (int i = 0; i < postfixs.length ; i++){
if (postfixs[i] >= '0' && postfixs[i] <= '9'){
calcStack.push(postfixs[i]);
}else{
int right = 0;
switch (postfixs[i]){
case 'x':
res =(calcStack.pop()-'0') * (calcStack.pop()-'0');
calcStack.push((char)((int)'0'+res));
break;
case '/':
right = calcStack.pop()-'0';
res =((calcStack.pop()-'0') / right);
calcStack.push((char)((int)'0'+res));
break;
case '+':
res =(calcStack.pop()-'0' )+ (calcStack.pop()-'0');
calcStack.push((char)((int)'0'+res));
break;
case '-':
right = calcStack.pop()-'0';
res = (calcStack.pop()-'0') - right;
calcStack.push((char)((int)'0'+res));
break;
}
}
}
res = calcStack.pop() - '0';
return res;
}
}
class Stack{
private int maxSize;
private char stackArray[];
private int top;
public Stack(int max){
maxSize = max;
stackArray = new char[max];
top = -1;
}
public char pop() {
return stackArray[top--];
}
public void push(char x){
stackArray[++top] = x;
}
public char peek(){
if (top != -1)
return stackArray[top];
else
return ' ';
}
public boolean isEmpty(){
return top==-1;
}
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
String strs[] = new String[n];
for(int i = 0;i < n;i++) {
strs[i] = s.next();
}
for (int j = 0; j < n;j++){
if(calc(strs[j]) == 24){
System.out.println("Yes");
}else {
System.out.println("No");
}
}
}
public static int calc(String str){
int res = 0;
char chars[] = str.toCharArray();
//中缀表达式转后缀表达式
Stack stack = new Stack(10);
String postfix = "";
for (int i=0;i<chars.length;i++){
if (chars[i] > '9' || chars[i] < '0'){ //只要不是数字必定是操作符 操作符要出栈到“小于”当前操作符优先级
while (stack.peek()=='x' || stack.peek()=='/'){
postfix +=stack.pop();
}
stack.push(chars[i]);
}
else{
postfix += chars[i];
}
}
while (!stack.isEmpty()){
postfix += stack.pop();
}
//计算后缀表达式
Stack calcStack = new Stack(10);
char postfixs[] = postfix.toCharArray();
for (int i = 0; i < postfixs.length ; i++){
if (postfixs[i] >= '0' && postfixs[i] <= '9'){
calcStack.push(postfixs[i]);
}else{
int right = 0;
switch (postfixs[i]){
case 'x':
res =(calcStack.pop()-'0') * (calcStack.pop()-'0');
calcStack.push((char)((int)'0'+res));
break;
case '/':
right = calcStack.pop()-'0';
res =((calcStack.pop()-'0') / right);
calcStack.push((char)((int)'0'+res));
break;
case '+':
res =(calcStack.pop()-'0' )+ (calcStack.pop()-'0');
calcStack.push((char)((int)'0'+res));
break;
case '-':
right = calcStack.pop()-'0';
res = (calcStack.pop()-'0') - right;
calcStack.push((char)((int)'0'+res));
break;
}
}
}
res = calcStack.pop() - '0';
return res;
}
}
class Stack{
private int maxSize;
private char stackArray[];
private int top;
public Stack(int max){
maxSize = max;
stackArray = new char[max];
top = -1;
}
public char pop() {
return stackArray[top--];
}
public void push(char x){
stackArray[++top] = x;
}
public char peek(){
if (top != -1)
return stackArray[top];
else
return ' ';
}
public boolean isEmpty(){
return top==-1;
}
}
你这个也叫能通过?我在你calc方法里加了个打印字符串postfix,你看看你的运行结果
1
9+3+4X3
9343X++
No
明显应该是Yes
你这个也叫能通过?我在你calc方法里加了个打印字符串postfix,你看看你的运行结果
1
9+3+4X3
9343X++
No
明显应该是Yes
题目里用的是 ‘x’ 不是 ‘X’ ,我没对'X'做判断,用‘x’转换出来的是正确的。