Java Swing实现计算器功能

Java Swing实现计算器功能

计算器支持混合四则运算
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

核心代码

/* 监听运算符包括点 */
	private class CalculatorListener implements ActionListener {

		JTextField display;
		JButton str;

		CalculatorListener(JTextField display, JButton str) {

			this.display = display;
			this.str = str;
		}

		public void actionPerformed(ActionEvent e) {

			StringBuffer s = new StringBuffer(display.getText());
			if (flag) {
				display.setText("0");
				flag = false;
			} else if (!(s.length() == 0)) {

				if (!((display.getText().endsWith("+")) || (display.getText().endsWith("-"))
						|| (display.getText().endsWith("X")) || (display.getText().endsWith("/")))) {
					// 当为无穷和非数字型,清空
					if (display.getText().indexOf("Infinity") != -1 || display.getText().indexOf("NaN") != -1) {

						display.setText("0");
						// 判断前面的数是不是小数,以决定要不要在它后面加小数点
					} else if (str.getText() == "." && Character.isDigit(s.charAt(s.length() - 1))) {
						int lastIndex = -1;
						Stack<String> stack = new Stack<String>();
						for (int i = 0; i < s.length(); i++) {
							lastIndex = new CalculatorImpl().readDouble(display.getText(), i);
							stack.push(display.getText().substring(i, lastIndex));
							i = lastIndex;
						}
						String last = stack.pop();

						if (last.indexOf(".") == -1) {
							s.append(str.getText());
							display.setText(s.toString());
						}
						// 普通情况
					} else if (!display.getText().endsWith(".")) {
						s.append(str.getText());
						display.setText(s.toString());
					}
					// 当前面是符号时,自动填零
				} else if (str.getText() == "." && (s.charAt(s.length() - 1) == '+' || s.charAt(s.length() - 1) == '-'
						|| s.charAt(s.length() - 1) == 'X' || s.charAt(s.length() - 1) == '/')) {
					s.append("0.");
					display.setText(s.toString());

				}
				// 为空时,按点填零
			} else if (s.length() == 0 && str.getText() == ".") {
				s.append("0.");
				display.setText(s.toString());
			}
		}

	}
	/* 转换逆波兰式 */
	public double toReversePolishNotation(String s) throws NumberFormatException {

		Stack<Character> s1 = new Stack<Character>();//
		Stack<Double> s2 = new Stack<Double>();
		int lastIndex = -1;
		char temp;
		String num;

		for (int i = 0; i < s.length(); i++) {
			System.out.println("第" + i + "趟");
			temp = s.charAt(i);
			// 判断是否为操作数,如果是,就截取操作数
			if (Character.isDigit(temp) || temp == '.' || temp == '-') {
				// 对出现的前面的负号进行处理
				if (temp == '-') {
					lastIndex = readDouble(s, i + 1);
					num = s.substring(i, lastIndex);
					System.out.println("截取字符串" + num);
					s2.push(Double.parseDouble(num));
					System.out.println("s2 入栈" + s2.peek());
					System.out.println("s1 入栈  --> +");
					s1.push('+');
				} else {
					lastIndex = readDouble(s, i);
					num = s.substring(i, lastIndex);
					System.out.println("截取字符串" + num);
					s2.push(Double.parseDouble(num));
					System.out.println("s2 入栈" + s2.peek());
				}
				i = lastIndex - 1;
				System.out.println("当前i" + i);
			} else {
				// 乘除时,直接做运算
				if (temp == 'X' || temp == '/') {
					System.out.println("s2出栈:-->" + s2.peek());
					double num1 = s2.pop();
					lastIndex = readDouble(s, i + 1);
					double num2 = Double.parseDouble(s.substring(i + 1, lastIndex));
					System.out.println("操作数:" + num2);

					i = lastIndex - 1;
					System.out.println("当前i" + i);
					double result = calculate(num1, temp, num2);
					System.out.println("num1" + temp + " num2 =" + result);
					System.out.println("result 入栈 s2" + result);
					s2.push(result);
					// 当为加减时,让他直接入栈,等待操作
				} else if (temp == '+' || temp == '-') {
					System.out.println("s1 入栈" + temp);
					s1.push(temp);
				}
			}

		}
		// 对剩下的加减运算,得出最终结果
		while (!s1.isEmpty() && !s2.isEmpty() && s2.size() >= 2) {

			System.out.println("s2 出栈:" + s2.peek());
			double num2 = s2.pop();
			System.out.println("s2 出栈:" + s2.peek());
			double num1 = s2.pop();
			System.out.println("s1 出栈:" + s1.peek());
			double result = calculate(num1, s1.pop(), num2);
			System.out.println("计算结果为: " + result);
			s2.push(result);
		}

		return s2.pop();
	}
发布了39 篇原创文章 · 获赞 157 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_34417749/article/details/104032608