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();
}
}
}
}
}