CCF 201903 二十四点(Java)

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");
			}
		}
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值