JAVA实现计算器

Posted mizersy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA实现计算器相关的知识,希望对你有一定的参考价值。

  1 import java.awt.Color;
  2 import java.awt.Container;
  3 import java.awt.GridLayout;
  4 import java.awt.TextField;
  5 import java.awt.event.ActionEvent;
  6 import java.awt.event.ActionListener;
  7 
  8 import javax.jws.HandlerChain;
  9 import javax.swing.JButton;
 10 import javax.swing.JFrame;
 11 import javax.swing.JPanel;
 12 import javax.swing.JTextField;
 13 
 14 import java.util.Stack; 
 15 
 16 public class Main extends JFrame implements ActionListener{
 17     
 18     private String expression;//记录表达式
 19 
 20     //各个按键的字符
 21     private final String[] keys = {"(",")","C","Backspace",
 22                                    "7","8","9","+",
 23                                       "4","5","6","-",
 24                                    "1","2","3","*",
 25                                    ".","0","=","/"};
 26     private JTextField result = new JTextField("0");
 27 
 28     //按键
 29     private JButton[] button = new JButton[20];
 30     
 31     Main(){
 32 
 33 
 34         //计算器布局
 35         JPanel calckeysPanel = new JPanel(); 
 36         //布局先分为六行,第一行为文本显示,二到五行为按键
 37         calckeysPanel.setLayout(new GridLayout(6,1));
 38         
 39         calckeysPanel.add(result);
 40         result.setFont(result.getFont().deriveFont((float)(30)));
 41         Container[] containers = new Container[5];
 42         for (int i = 0;i < 5;++i){
 43             containers[i] = new Container();
 44             containers[i].setLayout(new GridLayout(1,4));
 45             calckeysPanel.add(containers[i]);
 46         }
 47         
 48         //按钮
 49         for (int i = 0;i < button.length;++i){
 50             button[i] = new JButton(keys[i]);
 51             button[i].setFont(button[i].getFont().deriveFont((float)(30)));
 52             containers[i/4].add(button[i]);
 53             button[i].addActionListener(this);
 54             if (i == 2 || i == 3) button[i].setForeground(Color.red);
 55         }
 56         getContentPane().add(calckeysPanel);
 57 
 58         //表达式赋值为空
 59         expression = "";
 60     }
 61     
 62     
 63 
 64     @Override
 65     public void actionPerformed(ActionEvent e) {
 66         // TODO Auto-generated method stub
 67         String action = e.getActionCommand();
 68 
 69         
 70         if (action.equals(keys[2])){
 71         //用户按下C
 72             handleC();
 73         }else if (action.equals(keys[3])){
 74         //用户按下退格
 75             handleBackspace();
 76         }else if (action.equals(keys[18])){
 77         //用户按下=
 78             handleCalc();
 79         }else{
 80         //用户输入表达式
 81             handleExpression(action);
 82         }
 83     }
 84     
 85     //处理按下C的事件
 86     private void handleC(){
 87         expression = "";
 88         result.setText("");
 89     }
 90     
 91     //处理按下退格的事件
 92     private void handleBackspace(){
 93         expression = expression.substring(0,expression.length() - 1);
 94         result.setText(expression);
 95     }
 96     
 97     //处理按下等号的事件
 98     private void handleCalc(){
 99         result.setText(Calculator.calrp(Calculator.getrp(expression)));
100         expression = "";
101     }
102     
103     //处理用户按下数字或运算符的事件
104     private void handleExpression(String action){
105         expression += action;
106         result.setText(expression);
107     }
108     
109     public static void main(String[] args){
110         Main calculator = new Main();
111         calculator.setSize(600,800);
112         calculator.setVisible(true);
113     }
114 
115 }
116 
117 class Calculator {
118     //计算中缀表达式
119     static Stack<Character> op = new Stack<>();
120  
121     public static Float getv(char op, Float f1, Float f2){
122         if(op == \'+\') return f2 + f1;
123         else if(op == \'-\') return f2 - f1;
124         else if(op  == \'*\') return f2 * f1;
125         else if(op == \'/\') return f2 / f1;
126         else return Float.valueOf(-0);
127     }
128 
129     public static String calrp(String rp){
130         Stack<Float> v = new Stack<>();
131         char[] arr = rp.toCharArray();
132         int len = arr.length;
133         for(int i = 0; i < len; i++){
134             Character ch = arr[i];
135  
136             if(ch >= \'0\' && ch <= \'9\') v.push(Float.valueOf(ch - \'0\'));
137 
138             else v.push(getv(ch, v.pop(), v.pop()));
139         }
140         return v.pop().toString();
141     }
142 
143     public static String getrp(String s){
144          char[] arr = s.toCharArray();
145          int len = arr.length;
146          String out = "";
147  
148          for(int i = 0; i < len; i++){
149              char ch = arr[i];
150              if(ch == \' \') continue;
151  
152 
153              if(ch >= \'0\' && ch <= \'9\') {
154                  out+=ch;
155                  continue;
156              }
157              
158              if(ch == \'(\') op.push(ch);
159  
160              if(ch == \'+\' || ch == \'-\'){
161                  while(!op.empty() && (op.peek() != \'(\')) 
162                      out+=op.pop();
163                  op.push(ch);
164                  continue;
165              }
166  
167              if(ch == \'*\' || ch == \'/\'){
168                  while(!op.empty() && (op.peek() == \'*\' || op.peek() == \'/\')) 
169                      out+=op.pop();
170                  op.push(ch);
171                  continue;
172              }
173  
174              if(ch == \')\'){
175                  while(!op.empty() && op.peek() != \'(\') 
176                      out += op.pop();
177                  op.pop();
178                  continue;
179              }
180          }
181          while(!op.empty()) out += op.pop();
182          return out;
183     }
184 }

用Java实现的简易计算器

运行效果图如下:

 

以上是关于JAVA实现计算器的主要内容,如果未能解决你的问题,请参考以下文章

# Java 常用代码片段

java 代码片段

LockSupport.java 中的 FIFO 互斥代码片段

ASP.net MVC 代码片段问题中的 Jqgrid 实现

golang代码片段(摘抄)

部分代码片段