package csdn20220613;
import javax.swing.*;
import java.util.Stack;
public class CalTest extends JFrame {
public static void main(String[] args) throws Exception {
new CalTest();
System.out.println(CalTest.cal("3 * 4 - 2 / 3"));
}
public CalTest() {
super("计算器");
JPanel jPanel = new JPanel();
JTextField jTextField = new JTextField();
jTextField.setColumns(20);
JButton clear = new JButton("清零");
clear.addActionListener(e -> jTextField.setText(""));
JButton backspace = new JButton("退格");
backspace.addActionListener(e -> {
String text = jTextField.getText();
if (text.length() == 0) {
return;
}
jTextField.setText(text.substring(0,text.length() - 1));
});
JButton bfh = new JButton("%");
bfh.addActionListener(e -> jTextField.setText(jTextField.getText() + "%"));
JButton pfg = new JButton("平方根");
pfg.addActionListener(e -> {
String text = jTextField.getText();
if (!text.matches("^[0-9]+$")) {
JOptionPane.showMessageDialog(null,"输入框中只能输入纯数字");
jTextField.setText("");
return;
}
jTextField.setText(Math.sqrt(Double.parseDouble(text)) + "");
});
JButton number1 = new JButton(" 1 ");
number1.addActionListener(e -> jTextField.setText(jTextField.getText() + "1 "));
JButton number2 = new JButton(" 2 ");
number2.addActionListener(e -> jTextField.setText(jTextField.getText() + "2 "));
JButton number3 = new JButton(" 3 ");
number3.addActionListener(e -> jTextField.setText(jTextField.getText() + "3 "));
JButton add = new JButton(" + ");
add.addActionListener(e -> jTextField.setText(jTextField.getText() + "+ "));
JButton number4 = new JButton(" 4 ");
number4.addActionListener(e -> jTextField.setText(jTextField.getText() + "4 "));
JButton number5 = new JButton(" 5 ");
number5.addActionListener(e -> jTextField.setText(jTextField.getText() + "5 "));
JButton number6 = new JButton(" 6 ");
number6.addActionListener(e -> jTextField.setText(jTextField.getText() + "6 "));
JButton sub = new JButton(" - ");
sub.addActionListener(e -> jTextField.setText(jTextField.getText() + "- "));
JButton number7 = new JButton(" 7 ");
number7.addActionListener(e -> jTextField.setText(jTextField.getText() + "7 "));
JButton number8 = new JButton(" 8 ");
number8.addActionListener(e -> jTextField.setText(jTextField.getText() + "8 "));
JButton number9= new JButton(" 9 ");
number9.addActionListener(e -> jTextField.setText(jTextField.getText() + "9 "));
JButton mul = new JButton(" * ");
mul.addActionListener(e -> jTextField.setText(jTextField.getText() + "* "));
JButton number0 = new JButton(" 0 ");
number0.addActionListener(e -> jTextField.setText(jTextField.getText() + "0 "));
JButton point = new JButton(" . ");
point.addActionListener(e -> jTextField.setText(jTextField.getText() + ". "));
JButton eq = new JButton(" = ");
eq.addActionListener(e -> {
try {
jTextField.setText(CalTest.calculate(jTextField.getText()));
} catch (Exception ex) {
ex.printStackTrace();
}
});
JButton div = new JButton(" / ");
div.addActionListener(e -> jTextField.setText(jTextField.getText() + "/ "));
jPanel.add(jTextField);
jPanel.add(clear);
jPanel.add(backspace);
jPanel.add(bfh);
jPanel.add(pfg);
jPanel.add(number1);
jPanel.add(number2);
jPanel.add(number3);
jPanel.add(add);
jPanel.add(number4);
jPanel.add(number5);
jPanel.add(number6);
jPanel.add(sub);
jPanel.add(number7);
jPanel.add(number8);
jPanel.add(number9);
jPanel.add(mul);
jPanel.add(number0);
jPanel.add(point);
jPanel.add(eq);
jPanel.add(div);
setSize(290,300);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
add(jPanel);
}
private static String calculate(String input) throws Exception {
String[] comput = input.split(" ");
Stack<Double> stack = new Stack<>();
Double m = Double.parseDouble(comput[0]);
//第一个操作数入栈
stack.push(m);
for(int i = 1; i < comput.length; i++) {
if(i%2==1) {
if(comput[i].equals("+")) {
stack.push(Double.parseDouble(comput[i+1]));
}
if(comput[i].equals("-")) {
stack.push(-Double.parseDouble(comput[i+1]));
}
//将前一个数出栈做乘法再入栈
if(comput[i].equals("*")) {
//取栈顶元素
Double d = stack.peek();
stack.pop();
stack.push(d*Double.parseDouble(comput[i+1]));
}
//将前一个数出栈做乘法再入栈
if(comput[i].equals("/")) {
double help = Double.parseDouble(comput[i+1]);
if(help == 0) {
//不会继续执行该函数
throw new Exception("Infinity");
}
double d = stack.peek();
stack.pop();
stack.push(d/help);
}
}
}
double d = 0d;
//求和
while(!stack.isEmpty()) {
d += stack.peek();
stack.pop();
}
String result = String.valueOf(d);
return result;
}
public static Integer cal(String input) {
Stack<Integer> calc = new Stack<>();
for(int i = 0; i < input.length(); i++){
char c = input.charAt(i);
int x = 0;
int y = 0;
int r = 0;
if(Character.isDigit(c)){
int t = Character.getNumericValue(c);
calc.push(t);
}
else if(c == '+'){
x = calc.pop();
y = calc.pop();
r = x+y;
calc.push(r);
}
else if(c == '-'){
x = calc.pop();
y = calc.pop();
r = x-y;
calc.push(r);
}
else if(c == '*'){
x = calc.pop();
y = calc.pop();
r = x*y;
calc.push(r);
}
else if(c == '/'){
x = calc.pop();
y = calc.pop();
r = x/y;
calc.push(r);
}
}
return calc.pop();
}
}
java计算器
最新推荐文章于 2024-08-23 15:54:50 发布
该代码创建了一个基于JavaSwing的简单计算器应用,包括数字按钮、运算符按钮以及清零、退格功能。用户输入的表达式会通过事件处理器处理,计算结果会在文本框中显示。程序使用栈数据结构解析和计算数学表达式。
摘要由CSDN通过智能技术生成