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