CCF二十四点问题求解

DeH40 2019-09-04 04:54:41
问题如下:

我写的只能得到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;
}
}


...全文
269 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2019-09-06
  • 打赏
  • 举报
回复
字符串位置相对都是固定的,你第一步分离根本没必要,数字就是char数组的0,2,4,6 ;符号就是1,3,5
qq_39936465 2019-09-06
  • 打赏
  • 举报
回复
用 Expression 和 Expression.eval方法
qq_39936465 2019-09-06
  • 打赏
  • 举报
回复
引用 6 楼 DeH40 的回复:
题目里用的是 ‘x’ 不是 ‘X’ ,我没对'X'做判断,用‘x’转换出来的是正确的。
我看了一下题目你搞的太复杂了吧,只要把原来的字符串,转换为计算式然后和24比较一下就行了,用堆栈完全是浪费。
qq_39936465 2019-09-05
  • 打赏
  • 举报
回复
引用 楼主 DeH40 的回复:
问题如下: 我写的只能得到30分,求大神指点! [/code]
感觉是你逻辑有问题,数字和符号分离,不出错才怪,自己输入点数据测试一下不就知道了。
DeH40 2019-09-05
  • 打赏
  • 举报
回复
DeH40 2019-09-05
  • 打赏
  • 举报
回复
引用 5 楼 qq_39936465 的回复:
都说了,你乘法提前了,4X3要跟着乘号走,你跟了么?这题没这么简单。
DeH40 2019-09-05
  • 打赏
  • 举报
回复
引用 4 楼 qq_39936465 的回复:
[quote=引用 3 楼 DeH40 的回复:] 题目中的十个用例全部通过
你这个也叫能通过?我在你calc方法里加了个打印字符串postfix,你看看你的运行结果

1
9+3+4X3
9343X++
No
明显应该是Yes [/quote] 题目里用的是 ‘x’ 不是 ‘X’ ,我没对'X'做判断,用‘x’转换出来的是正确的。
qq_39936465 2019-09-05
  • 打赏
  • 举报
回复
都说了,你乘法提前了,4X3要跟着乘号走,你跟了么?这题没这么简单。
qq_39936465 2019-09-05
  • 打赏
  • 举报
回复
引用 3 楼 DeH40 的回复:
题目中的十个用例全部通过
你这个也叫能通过?我在你calc方法里加了个打印字符串postfix,你看看你的运行结果

1
9+3+4X3
9343X++
No
明显应该是Yes
DeH40 2019-09-05
  • 打赏
  • 举报
回复
引用 2 楼 qq_39936465 的回复:
[quote=引用 楼主 DeH40 的回复:] 问题如下: 我写的只能得到30分,求大神指点! [/code]
感觉是你逻辑有问题,数字和符号分离,不出错才怪,自己输入点数据测试一下不就知道了。[/quote] 题目中的十个用例全部通过

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧