计算器

后缀表达式实现

(将一般表达式转换为后缀表达式)
开始:从左至右遍历算数表达式:
是数字,则存入表达式;
是运算符:①’(’,则入栈;
② ‘)’,则把栈中运算符加入后缀表达式,直到’(’;
③是其他运算符,优先级高于’(‘则入栈,否则从栈顶开始依次弹出,直至出现’)'为止
遍历结束,栈中所有运算符出栈

以下为代码段:

private String toSuffix(String ae) {
		Stack<String> stack = new Stack<String>();
		StringBuilder sb = new StringBuilder();
		String num = "";
		boolean hasNextNumBit = true;
		for(int x = 0; x<ae.length(); x++) {
			if(!((ae.charAt(x)>=48 && ae.charAt(x)<=57) || ae.charAt(x)==46)){
				hasNextNumBit = false;
			}
			if(hasNextNumBit) {
				num+=ae.charAt(x);
			}else {
				sb.append(num + " ");
				num = "";
			}
			if(hasNextNumBit && x==ae.length()-1) {
				sb.append(num + " ");
				num = "";
			}
			if(!hasNextNumBit) {
				if(ae.charAt(x) == '(') {
					stack.push(ae.charAt(x)+"");
				}
				if(ae.charAt(x)==')') {
					while(stack.peek().toString().charAt(0)!='(') {
						sb.append(stack.peek().toString()+"");
						stack.pop();
					}
					stack.pop();
				}
				if(ae.charAt(x) == '+' || ae.charAt(x) == '-') {
					while(!stack.empty() && (stack.peek().toString().charAt(0) !='(')) {
						if(stack.peek().toString().charAt(0) == '*' || stack.peek().toString().charAt(0)!='/'
									|| stack.peek().toString().charAt(0)!='+'
									|| stack.peek().toString().charAt(0)!='-') {
							sb.append(stack.peek().toString()+" ");
							stack.pop();
						}
					}
					stack.push(ae.charAt(x)+"");
				}
				if(ae.charAt(x) == '*' || ae.charAt(x) == '/') {
					while (!stack.empty()&&stack.peek().toString().charAt(0)!='(' 
								&& stack.peek().toString().charAt(0)!='+'&&stack.peek().toString().charAt(0)!='-') {
						if(stack.peek().toString().charAt(0)=='*' || stack.peek().toString().charAt(0)=='/' ) {
							sb.append(stack.peek().toString()+" ");
							stack.pop();
						}
					}
					stack.push(ae.charAt(x)+"");
				}
			}
			hasNextNumBit = true;
			if(x == ae.length()-1) {
				while (!stack.empty()) {
					sb.append(stack.peek().toString()+" ");
					stack.pop();
				}
			}	
		}
		return sb.toString().replaceAll(" +", " ").trim();
	}

求解后缀表达式

从左到右遍历后缀表达式,遇到数字就进栈,遇到运算符就将栈顶两个数字出栈进行运算,结果再次入栈,最终栈顶数字为运算结果(先出栈的为右操作数,后出栈的为左操作数)

以下为代码段:

private BigDecimal getSuffixResult(String se) {
		BigDecimal result = null;
		Stack<BigDecimal>stack = new Stack<BigDecimal>();
		String[] arr = se.trim().split(" ");
		for(int x=0; x<arr.length; x++) {
			if (arr[x].matches("^\\d+\\.$")) {
				stack.push(new BigDecimal(arr[x]+"0"));
			}
			if (arr[x].matches("^\\d+(.\\d+)?$")) {
				stack.push(new BigDecimal(arr[x]));
			}
			if (arr[x].matches("^[\\+\\-\\*\\/]$")) {
				char c = arr[x].charAt(0);
				switch (c) {
				case '+':
					BigDecimal aright = stack.pop();
					BigDecimal aleft = stack.pop();
					BigDecimal asum = aleft.add(aright);
					stack.push(asum);
					break;
				case '-':
					BigDecimal sright = stack.pop();
					BigDecimal sleft = stack.pop();
					BigDecimal ssum = sleft.subtract(sright);
					stack.push(ssum);
					break;
				case '*':
					BigDecimal mright = stack.pop();
					BigDecimal mleft = stack.pop();
					BigDecimal msum = mleft.multiply(mright);
					stack.push(msum);
					break;
				case '/':
					BigDecimal dright = stack.pop();
					BigDecimal dleft = stack.pop();
					BigDecimal dsum = dleft.divide(dright);
					stack.push(dsum);
					break;
				default:
					break;
				}
			}
		}
		result = stack.pop();
		return result;
	}

计算器按钮实现

此部分我自主学习了SpringLayout弹性布局,美化了计算器界面
仿照了CSDN上大神制作的计算器界面,并另外添加了个别我自己创作的东西,完成了有关计算器界面的实现问题。但遇到了个别问题不知如何解决,如,界面中“(”、“)”与“Del”键有显示冲突,虽不影响使用,但不太美观,尝试很多方法后仍不知如何处理,希望在以后学习中可以有效解决。

如以下代码行,采用了SpringLayout弹性布局,美化按钮界面,其中括号内代码部分表示在图形界面中,“7”键的上下左右约束以及其间隔

springLayout.putConstraint(SpringLayout.NORTH, seven, 0, SpringLayout.SOUTH, result);

以下是框架、按钮部分中,以按钮“7”为例,编写的代码段:

		JButton seven=new JButton("7");
		seven.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent arg0) {
				String sevenTxt = getBtnText(seven);
				txtToInputTxt(sevenTxt, inputTxt);
				setResult(inputTxt.getText());
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, seven, 0, SpringLayout.SOUTH, result);
		springLayout.putConstraint(SpringLayout.WEST, seven, 0, SpringLayout.WEST, result);
		springLayout.putConstraint(SpringLayout.SOUTH, seven, 80, SpringLayout.SOUTH, result);
		springLayout.putConstraint(SpringLayout.EAST, seven, 80, SpringLayout.WEST, frmCalculator.getContentPane());
		seven.setFont(new Font("黑体", Font.BOLD, 50));
		seven.setForeground(Color.WHITE);
		seven.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(seven);
		
		

总结

本次项目实验完成后,难点在于将中缀表达式转换为后缀表达式并计算、输出结果,以及对图形开发界面的学习,是一次全新的体验,学习到了很多不同的知识。

参考资料:
图形界面参考:
Java图形用户界面设计
SpringLayout弹性布局
计算器部分代码段参考:
https://blog.csdn.net/u012169821/article/details/81317869
https://blog.csdn.net/qq_36551426/article/details/80363584
https://blog.csdn.net/suiyuehuimou/article/details/78515586
https://blog.csdn.net/qq_41915690/article/details/80464010
等等

完整代码

package cn.asam.calculator;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.math.BigDecimal;
import java.util.Stack;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
import javax.swing.SwingConstants;

public class Calculator {
	private JFrame frmCalculator;
	private JTextField inputTxt;
	private JTextField result;
	private JSeparator separator;
	private JButton eight;
	private JButton nine;
	private JButton multiply;
	private JButton leftBracket;
	private JButton four;
	private JButton five;
	private JButton six;
	private JButton subtract;
	private JButton rightBracket;
	private JButton one;
	private JButton two;
	private JButton three;
	private JButton add;
	private JButton dot;
	private JButton zero;
	private JButton divide;
	private JButton btnEqual;
	private JButton btnDel;
	
	public static void main(String [] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Calculator window = new Calculator();
					window.frmCalculator.setVisible(true);
				} catch(Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	public Calculator() {
		initialize();
	}
	//获取输入参数按钮的文本
	private String getBtnText(JButton btn) {
		String text = null;
		text = btn.getText();
		return text;
	}
	//按钮上的文本显示到输入框中
	private void txtToInputTxt(String str, JTextField inputTxt) {
		String currentTxt = inputTxt.getText();
		if (str.matches("^[\\+\\-\\*\\/]$") && currentTxt.matches("^.+[\\+\\-\\*\\/]$")) {
			int strLength = currentTxt.length();
			String rStr = currentTxt.substring(0, strLength - 1);
			inputTxt.setText(rStr + str);
		} else {
			inputTxt.setText(currentTxt + str);
		}
	}
	//计算结果
	private void setResult(String inputTxt) {
		String suffixExpre = toSuffix(inputTxt);
		BigDecimal rSum = getSuffixResult(suffixExpre);
		result.setText(rSum.doubleValue() + "");
	}
	//初始化框架
	private void initialize () {
		frmCalculator = new JFrame();
		frmCalculator.setResizable(false);
		frmCalculator.setTitle("Calculator");
		frmCalculator.getContentPane().setBackground(Color.DARK_GRAY);
		frmCalculator.setBounds(800, 200, 386, 454);
		frmCalculator.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		inputTxt = new JTextField();
		inputTxt.setEditable(false);
		inputTxt.setBackground(Color.WHITE);
		inputTxt.setBorder(null);
		inputTxt.setFont(new Font("黑体", Font.BOLD, 32));
		inputTxt.setHorizontalAlignment(SwingConstants.RIGHT);
		inputTxt.setText("");
		inputTxt.setColumns(400);
		SpringLayout springLayout = new SpringLayout();
		springLayout.putConstraint(SpringLayout.NORTH, inputTxt, 0, SpringLayout.NORTH, frmCalculator.getContentPane());
		springLayout.putConstraint(SpringLayout.WEST, inputTxt, 0, SpringLayout.WEST, frmCalculator.getContentPane());
		springLayout.putConstraint(SpringLayout.SOUTH, inputTxt, 50, SpringLayout.NORTH, frmCalculator.getContentPane());
		springLayout.putConstraint(SpringLayout.EAST, inputTxt, 382, SpringLayout.WEST, frmCalculator.getContentPane());
		frmCalculator.getContentPane().setLayout(springLayout);
		
		result = new JTextField();
		result.setBackground(Color.WHITE);
		result.setBorder(null);
		springLayout.putConstraint(SpringLayout.SOUTH, result, 100, SpringLayout.NORTH, frmCalculator.getContentPane());
		result.setText("");
		result.setFont(new Font("宋体", Font.BOLD, 25));
		result.setHorizontalAlignment(SwingConstants.RIGHT);
		result.setEditable(false);
		springLayout.putConstraint(SpringLayout.NORTH, result, 0, SpringLayout.SOUTH, inputTxt);
		springLayout.putConstraint(SpringLayout.WEST, result, 0, SpringLayout.WEST, inputTxt);
		springLayout.putConstraint(SpringLayout.EAST, result, 382, SpringLayout.WEST, frmCalculator.getContentPane());
		result.setColumns(400);
		frmCalculator.getContentPane().add(result);
		frmCalculator.getContentPane().add(inputTxt);
		
		separator = new JSeparator();
		springLayout.putConstraint(SpringLayout.NORTH, separator, 6, SpringLayout.SOUTH, result);
		springLayout.putConstraint(SpringLayout.WEST, separator, 0, SpringLayout.WEST, frmCalculator.getContentPane());
		springLayout.putConstraint(SpringLayout.SOUTH, separator, -2, SpringLayout.SOUTH, result);
		springLayout.putConstraint(SpringLayout.EAST, separator, 382, SpringLayout.WEST, frmCalculator.getContentPane());
		frmCalculator.getContentPane().add(separator);
		
		JButton seven=new JButton("7");
		seven.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent arg0) {
				String sevenTxt = getBtnText(seven);
				txtToInputTxt(sevenTxt, inputTxt);
				setResult(inputTxt.getText());
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, seven, 0, SpringLayout.SOUTH, result);
		springLayout.putConstraint(SpringLayout.WEST, seven, 0, SpringLayout.WEST, result);
		springLayout.putConstraint(SpringLayout.SOUTH, seven, 80, SpringLayout.SOUTH, result);
		springLayout.putConstraint(SpringLayout.EAST, seven, 80, SpringLayout.WEST, frmCalculator.getContentPane());
		seven.setFont(new Font("黑体", Font.BOLD, 50));
		seven.setForeground(Color.WHITE);
		seven.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(seven);
		
		eight = new JButton("8");
		eight.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String eightTxt = getBtnText(eight);
				txtToInputTxt(eightTxt, inputTxt);
				setResult(inputTxt.getText());
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, eight, 0, SpringLayout.SOUTH, result);
		springLayout.putConstraint(SpringLayout.WEST, eight, 0, SpringLayout.EAST, seven);
		springLayout.putConstraint(SpringLayout.SOUTH, eight, 80, SpringLayout.SOUTH, result);
		springLayout.putConstraint(SpringLayout.EAST, eight, 80, SpringLayout.EAST, seven);
		eight.setFont(new Font("黑体", Font.BOLD, 50));
		eight.setForeground(Color.WHITE);
		eight.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(eight);
		
		nine = new JButton("9");
		nine.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String nineTxt = getBtnText(nine);
				txtToInputTxt(nineTxt, inputTxt);
				setResult(inputTxt.getText());
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, nine, 0, SpringLayout.NORTH, seven);
		springLayout.putConstraint(SpringLayout.WEST, nine, 0, SpringLayout.EAST, eight);
		springLayout.putConstraint(SpringLayout.SOUTH, nine, 80, SpringLayout.SOUTH, result);
		springLayout.putConstraint(SpringLayout.EAST, nine, 80, SpringLayout.EAST, eight);
		nine.setFont(new Font("黑体", Font.BOLD, 50));
		nine.setForeground(Color.WHITE);
		nine.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(nine);
		
		multiply = new JButton("*");
		multiply.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String multiplyTxt = getBtnText(multiply);
				txtToInputTxt(multiplyTxt, inputTxt);
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, multiply, 0, SpringLayout.NORTH, seven);
		springLayout.putConstraint(SpringLayout.WEST, multiply, 0, SpringLayout.EAST, nine);
		springLayout.putConstraint(SpringLayout.SOUTH, multiply, 80, SpringLayout.SOUTH, result);
		springLayout.putConstraint(SpringLayout.EAST, multiply, 80, SpringLayout.EAST, nine);
		multiply.setFont(new Font("黑体", Font.BOLD, 50));
		multiply.setForeground(Color.WHITE);
		multiply.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(multiply);
		
		leftBracket = new JButton("(");
		leftBracket.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String leftBracketTxt = getBtnText(leftBracket);
				txtToInputTxt(leftBracketTxt, inputTxt);
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, leftBracket, 0, SpringLayout.NORTH, seven);
		springLayout.putConstraint(SpringLayout.WEST, leftBracket, 0, SpringLayout.EAST, multiply);
		springLayout.putConstraint(SpringLayout.SOUTH, leftBracket, 80, SpringLayout.SOUTH, result);
		springLayout.putConstraint(SpringLayout.EAST, leftBracket, 80, SpringLayout.EAST, multiply);
		leftBracket.setFont(new Font("黑体", Font.BOLD, 50));
		leftBracket.setForeground(Color.WHITE);
		leftBracket.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(leftBracket);
		
		four = new JButton("4");
		four.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String fourTxt = getBtnText(four);
				txtToInputTxt(fourTxt, inputTxt);
				setResult(inputTxt.getText());
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, four, 0, SpringLayout.SOUTH, seven);
		springLayout.putConstraint(SpringLayout.WEST, four, 0, SpringLayout.WEST, result);
		springLayout.putConstraint(SpringLayout.SOUTH, four, 80, SpringLayout.SOUTH, seven);
		springLayout.putConstraint(SpringLayout.EAST, four, 80, SpringLayout.WEST, frmCalculator.getContentPane());
		four.setFont(new Font("黑体", Font.BOLD, 50));
		four.setForeground(Color.WHITE);
		four.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(four);
		
		five = new JButton("5");
		five.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String fiveTxt = getBtnText(five);
				txtToInputTxt(fiveTxt, inputTxt);
				setResult(inputTxt.getText());
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, five, 0, SpringLayout.NORTH, four);
		springLayout.putConstraint(SpringLayout.WEST, five, 0, SpringLayout.WEST, eight);
		springLayout.putConstraint(SpringLayout.SOUTH, five, 80, SpringLayout.SOUTH, eight);
		springLayout.putConstraint(SpringLayout.EAST, five, 80, SpringLayout.EAST, four);
		five.setFont(new Font("黑体", Font.BOLD, 50));
		five.setForeground(Color.WHITE);
		five.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(five);
		
		six = new JButton("6");
		six.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String sixTxt = getBtnText(six);
				txtToInputTxt(sixTxt, inputTxt);
				setResult(inputTxt.getText());
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, six, 0, SpringLayout.NORTH, four);
		springLayout.putConstraint(SpringLayout.WEST, six, 0, SpringLayout.WEST, nine);
		springLayout.putConstraint(SpringLayout.SOUTH, six, 80, SpringLayout.SOUTH, nine);
		springLayout.putConstraint(SpringLayout.EAST, six, 80, SpringLayout.EAST, five);
		six.setFont(new Font("黑体", Font.BOLD, 50));
		six.setForeground(Color.WHITE);
		six.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(six);
		
		subtract = new JButton("-");
		subtract.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String subtractTxt = getBtnText(subtract);
				txtToInputTxt(subtractTxt, inputTxt);
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, subtract, 0, SpringLayout.NORTH, four);
		springLayout.putConstraint(SpringLayout.WEST, subtract, 0, SpringLayout.WEST, multiply);
		springLayout.putConstraint(SpringLayout.SOUTH, subtract, 80, SpringLayout.SOUTH, multiply);
		springLayout.putConstraint(SpringLayout.EAST, subtract, 80, SpringLayout.EAST, six);
		subtract.setFont(new Font("黑体", Font.BOLD, 50));
		subtract.setForeground(Color.WHITE);
		subtract.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(subtract);
		
		rightBracket = new JButton(")");
		rightBracket.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String rightBracketTxt = getBtnText(rightBracket);
				txtToInputTxt(rightBracketTxt, inputTxt);
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, rightBracket, 0, SpringLayout.NORTH, four);
		springLayout.putConstraint(SpringLayout.WEST, rightBracket, 0, SpringLayout.WEST, leftBracket);
		springLayout.putConstraint(SpringLayout.SOUTH, rightBracket, 80, SpringLayout.SOUTH, leftBracket);
		springLayout.putConstraint(SpringLayout.EAST, rightBracket, 80, SpringLayout.EAST, subtract);
		rightBracket.setFont(new Font("黑体", Font.BOLD, 50));
		rightBracket.setForeground(Color.WHITE);
		rightBracket.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(rightBracket);
		
		one = new JButton("1");
		one.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String oneTxt = getBtnText(one);
				txtToInputTxt(oneTxt, inputTxt);
				setResult(inputTxt.getText());
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, one, 0, SpringLayout.SOUTH, four);
		springLayout.putConstraint(SpringLayout.WEST, one, 0, SpringLayout.WEST, result);
		springLayout.putConstraint(SpringLayout.SOUTH, one, 80, SpringLayout.SOUTH, four);
		springLayout.putConstraint(SpringLayout.EAST, one, 80, SpringLayout.WEST, frmCalculator.getContentPane());
		one.setFont(new Font("黑体", Font.BOLD, 50));
		one.setForeground(Color.WHITE);
		one.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(one);
		
		two = new JButton("2");
		two.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String twoTxt = getBtnText(two);
				txtToInputTxt(twoTxt, inputTxt);
				setResult(inputTxt.getText());
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, two, 0, SpringLayout.NORTH, one);
		springLayout.putConstraint(SpringLayout.WEST, two, 0, SpringLayout.WEST, eight);
		springLayout.putConstraint(SpringLayout.SOUTH, two, 80, SpringLayout.SOUTH, five);
		springLayout.putConstraint(SpringLayout.EAST, two, 80, SpringLayout.EAST, one);
		two.setFont(new Font("黑体", Font.BOLD, 50));
		two.setForeground(Color.WHITE);
		two.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(two);
		
		three = new JButton("3");
		three.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String threeTxt = getBtnText(three);
				txtToInputTxt(threeTxt, inputTxt);
				setResult(inputTxt.getText());
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, three, 0, SpringLayout.NORTH, one);
		springLayout.putConstraint(SpringLayout.WEST, three, 0, SpringLayout.WEST, nine);
		springLayout.putConstraint(SpringLayout.SOUTH, three, 80, SpringLayout.SOUTH, six);
		springLayout.putConstraint(SpringLayout.EAST, three, 80, SpringLayout.EAST, two);
		three.setFont(new Font("黑体", Font.BOLD, 50));
		three.setForeground(Color.WHITE);
		three.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(three);
		
		add = new JButton("+");
		add.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String addTxt = getBtnText(add);
				txtToInputTxt(addTxt, inputTxt);
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, add, 0, SpringLayout.NORTH, one);
		springLayout.putConstraint(SpringLayout.WEST, add, 0, SpringLayout.WEST, multiply);
		springLayout.putConstraint(SpringLayout.SOUTH, add, 80, SpringLayout.SOUTH, subtract);
		springLayout.putConstraint(SpringLayout.EAST, add, 80, SpringLayout.EAST, three);
		add.setFont(new Font("黑体", Font.BOLD, 50));
		add.setForeground(Color.WHITE);
		add.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(add);
		
		dot = new JButton(".");
		dot.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String dotTxt = getBtnText(dot);
				txtToInputTxt(dotTxt, inputTxt);
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, dot, 0, SpringLayout.SOUTH, one);
		springLayout.putConstraint(SpringLayout.WEST, dot, 0, SpringLayout.WEST, result);
		springLayout.putConstraint(SpringLayout.SOUTH, dot, 80, SpringLayout.SOUTH, one);
		springLayout.putConstraint(SpringLayout.EAST, dot, 80, SpringLayout.WEST, frmCalculator.getContentPane());
		dot.setFont(new Font("黑体", Font.BOLD, 50));
		dot.setForeground(Color.WHITE);
		dot.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(dot);
		
		zero = new JButton("0");
		zero.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String zeroTxt = getBtnText(zero);
				txtToInputTxt(zeroTxt, inputTxt);
				setResult(inputTxt.getText());
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, zero, 0, SpringLayout.NORTH, dot);
		springLayout.putConstraint(SpringLayout.WEST, zero, 0, SpringLayout.WEST, eight);
		springLayout.putConstraint(SpringLayout.SOUTH, zero, 80, SpringLayout.SOUTH, two);
		springLayout.putConstraint(SpringLayout.EAST, zero, 80, SpringLayout.EAST, dot);
		zero.setFont(new Font("黑体", Font.BOLD, 50));
		zero.setForeground(Color.WHITE);
		zero.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(zero);
		
		divide = new JButton("/");
		divide.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				String divideTxt = getBtnText(divide);
				txtToInputTxt(divideTxt, inputTxt);
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, divide, 0, SpringLayout.NORTH, dot);
		springLayout.putConstraint(SpringLayout.WEST, divide, 0, SpringLayout.WEST, nine);
		springLayout.putConstraint(SpringLayout.SOUTH, divide, 80, SpringLayout.SOUTH, three);
		springLayout.putConstraint(SpringLayout.EAST, divide, 80, SpringLayout.EAST, zero);
		divide.setFont(new Font("黑体", Font.BOLD, 50));
		divide.setForeground(Color.WHITE);
		divide.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(divide);
		
		btnEqual = new JButton("=");
		btnEqual.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if(inputTxt.getText().matches("^.+[\\+\\-\\*\\/]$")) {
					String currentTxt = inputTxt.getText();
					int strLength = currentTxt.length();
					String rStr = currentTxt.substring(0, strLength - 1);
					inputTxt.setText(rStr);
				}
				setResult(inputTxt.getText());
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, btnEqual, 0, SpringLayout.NORTH, dot);
		springLayout.putConstraint(SpringLayout.WEST, btnEqual, 0, SpringLayout.WEST, multiply);
		springLayout.putConstraint(SpringLayout.SOUTH, btnEqual, 80, SpringLayout.SOUTH, add);
		springLayout.putConstraint(SpringLayout.EAST, btnEqual, 80, SpringLayout.EAST, divide);
		btnEqual.setFont(new Font("黑体", Font.BOLD, 50));
		btnEqual.setForeground(Color.WHITE);
		btnEqual.setBackground(Color.DARK_GRAY);
		frmCalculator.getContentPane().add(btnEqual);
	
	
	btnDel = new JButton("Del");
	btnDel.addMouseListener( new MouseAdapter() {
		public void mouseClicked(MouseEvent e) {
			if ( inputTxt.getText()=="" || inputTxt.getText()== null) {
				result.setText("");
				btnDel.setEnabled(false);
			}
			String currentTxt = inputTxt.getText();
			int strLength = currentTxt.length();
			String rStr = currentTxt.substring(0, strLength - 1);
			inputTxt.setText(rStr);
			if ( inputTxt.getText().matches("^.+[\\+\\-\\*\\/]$")) {
				rStr = currentTxt.substring(0, strLength - 2);
			}
			setResult(rStr);
		}
	});
	springLayout.putConstraint(SpringLayout.NORTH, btnDel, 0, SpringLayout.NORTH, seven);
	springLayout.putConstraint(SpringLayout.WEST, btnDel, 320, SpringLayout.SOUTH, result);
	springLayout.putConstraint(SpringLayout.SOUTH, btnDel, 62, SpringLayout.EAST, multiply);
	btnDel.setForeground(Color.WHITE);
	btnDel.setBackground(Color.DARK_GRAY);
	btnDel.setFont(new Font("黑体", Font.BOLD, 16));
	springLayout.putConstraint(SpringLayout.WEST, btnDel, 0, SpringLayout.EAST, add);
	frmCalculator.getContentPane().add(btnDel);
	}
	
	//将后缀表达式计算出结果
	private BigDecimal getSuffixResult(String se) {
		BigDecimal result = null;
		Stack<BigDecimal>stack = new Stack<BigDecimal>();
		String[] arr = se.trim().split(" ");
		for(int x=0; x<arr.length; x++) {
			if (arr[x].matches("^\\d+\\.$")) {
				stack.push(new BigDecimal(arr[x]+"0"));
			}
			if (arr[x].matches("^\\d+(.\\d+)?$")) {
				stack.push(new BigDecimal(arr[x]));
			}
			if (arr[x].matches("^[\\+\\-\\*\\/]$")) {
				char c = arr[x].charAt(0);
				switch (c) {
				case '+':
					BigDecimal aright = stack.pop();
					BigDecimal aleft = stack.pop();
					BigDecimal asum = aleft.add(aright);
					stack.push(asum);
					break;
				case '-':
					BigDecimal sright = stack.pop();
					BigDecimal sleft = stack.pop();
					BigDecimal ssum = sleft.subtract(sright);
					stack.push(ssum);
					break;
				case '*':
					BigDecimal mright = stack.pop();
					BigDecimal mleft = stack.pop();
					BigDecimal msum = mleft.multiply(mright);
					stack.push(msum);
					break;
				case '/':
					BigDecimal dright = stack.pop();
					BigDecimal dleft = stack.pop();
					BigDecimal dsum = dleft.divide(dright);
					stack.push(dsum);
					break;
				default:
					break;
				}
			}
		}
		result = stack.pop();
		return result;
	}
	//将一般表达式转换为后缀表达式
	private String toSuffix(String ae) {
		Stack<String> stack = new Stack<String>();
		StringBuilder sb = new StringBuilder();
		String num = "";
		boolean hasNextNumBit = true;
		for(int x = 0; x<ae.length(); x++) {
			if(!((ae.charAt(x)>=48 && ae.charAt(x)<=57) || ae.charAt(x)==46)){
				hasNextNumBit = false;
			}
			if(hasNextNumBit) {
				num+=ae.charAt(x);
			}else {
				sb.append(num + " ");
				num = "";
			}
			if(hasNextNumBit && x==ae.length()-1) {
				sb.append(num + " ");
				num = "";
			}
			if(!hasNextNumBit) {
				if(ae.charAt(x) == '(') {
					stack.push(ae.charAt(x)+"");
				}
				if(ae.charAt(x)==')') {
					while(stack.peek().toString().charAt(0)!='(') {
						sb.append(stack.peek().toString()+"");
						stack.pop();
					}
					stack.pop();
				}
				if(ae.charAt(x) == '+' || ae.charAt(x) == '-') {
					while(!stack.empty() && (stack.peek().toString().charAt(0) !='(')) {
						if(stack.peek().toString().charAt(0) == '*' || stack.peek().toString().charAt(0)!='/'
									|| stack.peek().toString().charAt(0)!='+'
									|| stack.peek().toString().charAt(0)!='-') {
							sb.append(stack.peek().toString()+" ");
							stack.pop();
						}
					}
					stack.push(ae.charAt(x)+"");
				}
				if(ae.charAt(x) == '*' || ae.charAt(x) == '/') {
					while (!stack.empty()&&stack.peek().toString().charAt(0)!='(' 
								&& stack.peek().toString().charAt(0)!='+'&&stack.peek().toString().charAt(0)!='-') {
						if(stack.peek().toString().charAt(0)=='*' || stack.peek().toString().charAt(0)=='/' ) {
							sb.append(stack.peek().toString()+" ");
							stack.pop();
						}
					}
					stack.push(ae.charAt(x)+"");
				}
			}
			hasNextNumBit = true;
			if(x == ae.length()-1) {
				while (!stack.empty()) {
					sb.append(stack.peek().toString()+" ");
					stack.pop();
				}
			}	
		}
		return sb.toString().replaceAll(" +", " ").trim();
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值