java(带括号优先级的GUI计算器)

package 计算器;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

import javax.swing.*;

public class MyCalculator
{
	public static void main(String[] args)
	{
		new Calculate().launch();
	}	
} 

class Calculate
{   JFrame f = new JFrame();
	private JTextField tf = null;
	private String strOper = null;
	public Stack<Double> OPND = new Stack<Double>();
    public Stack<String> OPTR = new Stack<String>();
    int n=0,b=0,v=0,w=0;   //n,b用来标记数字。n=1说明为连续输入。b=1说明是小数点,v标记计算符,w标记del
    String s,u,t,o;    //u,o,t 用于删除,

	public void launch()
	{	
		f.setTitle("zhangmingyang ");
		tf = new JTextField();
		tf.setBackground(Color.GREEN);
		//tf.setPreferredSize(new Dimension(50,50));
		tf.setFont(new Font("黑体",Font.BOLD,60));
		//setLayout(new BorderLayout());  //Frame默认的布局管理器就是BorderLayout
		f.add(tf, BorderLayout.NORTH);
		JPanel p = new JPanel(new GridLayout(4, 5, 5, 5));
			Button bn7 = new Button("7");
			bn7.setActionCommand("数字");
			p.add(bn7);
			bn7.addActionListener(new MyMonitor());	
			
			Button bn8 = new Button("8");
			bn8.setActionCommand("数字");
			p.add(bn8);
			bn8.addActionListener(new MyMonitor());	
			
			Button bn9 = new Button("9");
			bn9.setActionCommand("数字");
			p.add(bn9);
			bn9.addActionListener(new MyMonitor());	
			
			Button bnAdd = new Button("+");  
			p.add(bnAdd);
			bnAdd.setActionCommand("算术操作");
			bnAdd.addActionListener(new MyMonitor());
			
			Button bnClear = new Button("AC");  
			p.add(bnClear);
			bnClear.setActionCommand("AC");
			bnClear.addActionListener(new MyMonitor());
			
			Button bn4 = new Button("4");
			bn4.setActionCommand("数字");
			p.add(bn4);
			bn4.addActionListener(new MyMonitor());
			
			Button bn5 = new Button("5");
			bn5.setActionCommand("数字");
			p.add(bn5);
			bn5.addActionListener(new MyMonitor());
			
			Button bn6 = new Button("6");
			bn6.setActionCommand("数字");
			p.add(bn6);
			bn6.addActionListener(new MyMonitor());
			
			Button bnSub = new Button("-");  
			p.add(bnSub);
			bnSub.setActionCommand("算术操作");
			bnSub.addActionListener(new MyMonitor());
			
			Button bnDel = new Button("Del");  
			p.add(bnDel);
			bnDel.setActionCommand("Del");
			bnDel.addActionListener(new MyMonitor());
			
			Button bn1 = new Button("1");
			bn1.setActionCommand("数字");
			p.add(bn1);
			bn1.addActionListener(new MyMonitor());
			
			Button bn2 = new Button("2");
			bn2.setActionCommand("数字");
			p.add(bn2);
			bn2.addActionListener(new MyMonitor());
			
			Button bn3 = new Button("3");
			bn3.setActionCommand("数字");
			p.add(bn3);
			bn3.addActionListener(new MyMonitor());
			
			Button bnMult = new Button("*"); 
			bnMult.addActionListener(new MyMonitor()); 
			p.add(bnMult);
			bnMult.setActionCommand("算术操作");
			
			Button bnDot = new Button("."); 
			bnDot.addActionListener(new MyMonitor()); 
			p.add(bnDot);
			bnDot.setActionCommand(".");
			
			Button bnLb = new Button("("); 
			bnLb.addActionListener(new MyMonitor()); 
			p.add(bnLb);
			bnLb.setActionCommand("(");
			
			Button bn0 = new Button("0"); 
			bn0.addActionListener(new MyMonitor()); 
			p.add(bn0);
			bn0.setActionCommand("数字");
			
			Button bnRb = new Button(")"); 
			bnRb.addActionListener(new MyMonitor()); 
			p.add(bnRb);
			bnRb.setActionCommand(")");
			
			Button bnDiv = new Button("/"); 
			bnDiv.addActionListener(new MyMonitor()); 
			p.add(bnDiv);
			bnDiv.setActionCommand("算术操作");
			
			Button bnEq = new Button("=");  
			p.add(bnEq);
			bnEq.setActionCommand("=");
			bnEq.addActionListener(new MyMonitor());
			OPTR.push("#");     //重要
		
			
		
		f.add(p, BorderLayout.CENTER);
		f.setBounds(500, 300,500, 500);
		f.setBackground(Color.BLUE);
		f.setVisible(true);
		f.addWindowListener(  new WindowAdapter()
							  {
									@Override
									public void windowClosing(WindowEvent e)
									{
										System.exit(-1);
									} 				
							  }		
		);
	}
	
 class MyMonitor implements ActionListener
	{  //Stack OPND= new Stack();
	 // Stack OPTR= new Stack();
        //public Stack<Double> OPND = new Stack<Double>();
	    //public Stack<String> OPTR = new Stack<String>();
	  
		public int Precede (String a,String b ) {
		if(a.equals("+")&&(b.equals("+")||b.equals("-")||b.equals(")")||b.equals("#")))
			return 1;
		else if(a.equals("+")&&(b.equals("*")||b.equals("/")||b.equals("(")))
			return -1;
		else if (a.equals("-")&&(b.equals("+")||b.equals("-")||b.equals(")")||b.equals("#")))
			return 1;
		else if(a.equals("-")&&(b.equals("*")||b.equals("/")||b.equals("(")))
			return -1;
		else if (a.equals("*")&&(b.equals("+")||b.equals("-")||b.equals("*")||b.equals("/")||b.equals(")")||b.equals("#")))
			return 1;
		else if(a.equals("*")&&(b.equals("(")))
			return -1;
		else if (a.equals("/")&&(b.equals("+")||b.equals("-")||b.equals("*")||b.equals("/")||b.equals(")")||b.equals("#")))
			return 1;
		else if(a.equals("/")&&(b.equals("(")))
			return -1;
		else if (a.equals("(")&&(b.equals("+")||b.equals("-")||b.equals("*")||b.equals("/")||b.equals("(")))
			return -1;
		else if(a.equals("(")&&b.equals(")"))
				return 0;
		else if (a.equals(")")&&(b.equals("+")||b.equals("-")||b.equals("*")||b.equals("/")||b.equals(")")||b.equals("#")))
			return 1;
		else if (a.equals("#")&&(b.equals("+")||b.equals("-")||b.equals("*")||b.equals("/")||b.equals("(")))
			return -1;
		else if(a.equals("#")&&b.equals("#"))
			return 0;
		else return 0;	
	               }

		public void actionPerformed(ActionEvent e)
		{     double x=0,y=0,z=0,m;
		
			String strAc = e.getActionCommand();
			Button bn = (Button)e.getSource();
			String strLb = bn.getLabel();
			
			if (strAc.equals("数字"))
			{	w=0;
				if(n==0)
				{OPND.push(Double.parseDouble(strLb));
				tf.setText(tf.getText() + strLb);
				o=tf.getText();
				}
			else if(n>=1)
			     { 	if(b==0)
			        { m=OPND.pop()*10+Double.parseDouble(strLb);
			    	OPND.push(m);
			        tf.setText(tf.getText() + strLb);
			        }
			     else if(b==1)
			     {     m=OPND.pop()+Math.pow(10, (-n))*Double.parseDouble(strLb);
			     		OPND.push(m);
			     		 tf.setText(tf.getText() + strLb);
			     }
			    	 	 	 
			     }
					n=n+1;
					v=0;
			}
			else if (strAc.equals("算术操作"))  //如果是+ - * / 操作 
		{   	w=1;
				if(v==1) {
					tf.setText(s+strLb);
					u=tf.getText();
					t=tf.getText();
					OPTR.pop();
					OPTR.push(strLb);
			             }
			else if(v==0)
			{		s=tf.getText();  //记录上一次就是没有运算符之前的内容。
				    n=b=0;
				tf.setText(tf.getText()+strLb);
				u=tf.getText();
				t=tf.getText();
				if(Precede(OPTR.peek(),strLb)==-1)
				  {OPTR.push(strLb);}
			            
			  else if(Precede(OPTR.peek(),strLb)==0)
				{OPTR.pop();}
				
			 else if(Precede(OPTR.peek(),strLb)==1)
			  {	//OPTR.push(strLb);
				strOper = OPTR.pop();
				OPTR.push(strLb);
			    x=OPND.pop();
			    y=OPND.pop();
			    if(strOper.equals("+"))
			    z=x+y;
			    else if(strOper.equals("-"))
			    z=y-x;      //注意是y-x;
			    else if(strOper.equals("*"))
			    z=x*y;
			    else if(strOper.equals("/"))
			    z=1.0*y/x;
			    OPND.push(z);
			  }
				v=1;
			 }
		}
			else if (strAc.equals("(")) {
				w=2;
				//s=tf.getText();
				tf.setText(tf.getText()+strLb);
				u=tf.getText();
				if(Precede(OPTR.peek(),strLb)==-1)
				  {OPTR.push(strLb);}
			            
			  else if(Precede(OPTR.peek(),strLb)==0)
				{OPTR.pop();}
				
			 else if(Precede(OPTR.peek(),strLb)==1)
			  {	//OPTR.push(strLb);
				strOper = OPTR.pop();
				OPTR.push(strLb);
			    x=OPND.pop();
			    y=OPND.pop();
			    if(strOper.equals("+"))
			    z=x+y;
			    else if(strOper.equals("-"))
			    z=y-x;      //注意是y-x;
			    else if(strOper.equals("*"))
			    z=x*y;
			    else if(strOper.equals("/"))
			    z=1.0*y/x;
			    OPND.push(z);
			  }
				
			}
			else if (strAc.equals(")"))
		{	    w=1;
				n=b=0;
				tf.setText(tf.getText()+strLb);
				while(!OPTR.peek().equals("("))
			{strOper = OPTR.pop();
		    x=OPND.pop();
		    y=OPND.pop();
		    if(strOper.equals("+"))
		    z=x+y;
		    else if(strOper.equals("-"))
		    z=y-x;      //注意是y-x;
		    else if(strOper.equals("*"))
		    z=x*y;
		    else if(strOper.equals("/"))
		    z=1.0*y/x;
		    OPND.push(z);
		    }
				
		    OPTR.pop();      //把‘(’出栈
		    
		}
			else if(strAc.equals("."))
			{	n=1;
			    tf.setText(tf.getText() + strLb);
			    b=1;
			}
			else if (strAc.equals("="))
				{ n=b=0;
					v=0;
				while(!OPTR.peek().equals("#"))
				  {strOper = OPTR.pop();
			        x=OPND.pop();
			        y=OPND.pop();
			   
			        if(strOper.equals("+"))
			        { z=x+y;
			       //System.out.println("a");
			        }
			        else if(strOper.equals("-"))
			         z=y-x;      //注意是y-x;
			        else if(strOper.equals("*"))
			         z=x*y;
			        else if(strOper.equals("/"))
			         z=1.0*y/x;
			        OPND.push(z);
				  }
		
				   tf.setText(""+ OPND.peek()); 
				   OPND.clear();
					OPTR.clear();
				}
			
			else if (strAc.equals("AC"))
			{	n=b=0;
				v=0;
				OPND.clear();
				OPTR.clear();
				tf.setText("");
				OPTR.push("#");     //重要
			}
			else if (strAc.equals("Del"))
			{	if(w==0)
			           {
						n=0;
			           	v=1;
			           	tf.setText(u);
			           	OPND.pop();
			           		
			           }
				if(w==1) {	
							v=0;
							tf.setText(o);
							OPTR.pop();
				         }
				if(w==2) {w=1;
						tf.setText(t);
						OPTR.pop();
				         }
				
			}
			
		}
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值