github项目地址
该计算器用java实现
更新:现已支持多位数的输入(利用正则表达式提取输入的数值,再压入数值栈中)
GUI用swing实现,可识别括号优先级是用了双栈,一个栈存取操作符,一个栈存取数据
界面巨丑,待我学到更多后来更新此计算器。
主要是拿来练手的(这是第一个自己用代码实现GUI的小程序!!!)
主界面:
CalculatorFrame.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;
public class CalculatorFrame {
private JFrame frame; private JTextField number; private JPanel panel; private static String expression ="";
public CalculatorFrame(){ frame = new JFrame("Calculator"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300,300); frame.setLocationRelativeTo(null);
number = new JTextField(); number.setEditable(false); frame.add(number,BorderLayout.NORTH);
panel = new JPanel(); panel.setLayout(new GridLayout(6,3)); frame.add(panel,BorderLayout.CENTER);
for(int i =1;i<10;i++){ addButton(String.valueOf(i)); }
addButton("+"); addButton("0"); addButton("-"); addButton("*"); addButton("C"); addButton("/"); addButton("("); addButton(")");
JButton equal = new JButton("="); equal.setActionCommand("="); equal.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e){ number.setText(""+new Calculate().calculating(expression)); expression = ""; } }); panel.add(equal); frame.add(panel); frame.setResizable(false); frame.setVisible(true); }
private void addButton(String name ){ JButton temp = new JButton(name); temp.setActionCommand(name); temp.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(!"C".equals(name)){ expression += name; number.setText(expression); }else expression=""; } }); panel.add(temp); } }
|
Calculate.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| import java.util.*;
public class Calculate { private static Stack<String> ops = new Stack<>(); private static Stack<Double> nums = new Stack<>();
private static void calculate() { String op = ops.pop(); if (op.equals("+")) nums.push(nums.pop() + nums.pop()); else if (op.equals("-")) nums.push(-(nums.pop() - nums.pop())); else if (op.equals("*")) nums.push(nums.pop() * nums.pop()); else if (op.equals("/")) nums.push(nums.pop() / nums.pop()); }
public double calculating(String s){ System.out.println(s); String[] strs = s.split("[^0-9]+"); for(String str:strs){ nums.push(Double.parseDouble(str)); } for (int i = 0; i < s.length(); i++) { switch (s.charAt(i)) { case '(': break; case '+': ops.push("+"); break; case '-': ops.push("-"); break; case '*': ops.push("*"); break; case '/': ops.push("/"); break; case ')': { calculate(); break; } default: break; } } while (!ops.empty()) { calculate(); } return nums.pop(); } }
|
run.java
1 2 3 4 5 6 7 8 9 10 11 12
| import java.awt.*;
public class run { public static void main(String[] args){ EventQueue.invokeLater(new Runnable() { @Override public void run() { new CalculatorFrame(); } }); } }
|