import java.awt.Frame;
import java.awt.Panel;
import java.awt.GridLayout;
import java.awt.FlowLayout;
import java.awt.*;
import java.awt.event.*;
import java.util.Enumeration;
import java.util.Stack;
import java.lang.Integer;
public class ComputerFrame extends Frame implements ActionListener
{
Panel numberPanel;
TextField text;
Panel operatorPanel;
Button[] num;
Button[] oper;
public ComputerFrame()
{
super("这是一个计算机");
init();
}
public void init()
{
operatorPanel=new Panel();
numberPanel=new Panel();
text=new TextField(15);
num=new Button[10];
oper=new Button[7];
oper[0]=new Button("C");
oper[1]=new Button("←");
oper[2]=new Button("+");
oper[3]=new Button("-");
oper[4]=new Button("*");
oper[5]=new Button("/");
oper[6]=new Button("=");
setSize(200,500);
setFont(new Font("Dialog",Font.PLAIN,30));
setLayout(new FlowLayout());
numberPanel.setLayout(new GridLayout(4,3,5,5));
operatorPanel.setLayout(new GridLayout(4,2,5,5));
add(text);
add(numberPanel);
add(operatorPanel);
for(int i=1;i<10;i++)
{
num[i]=new Button(String.valueOf(i));
numberPanel.add(num[i]);
num[i].addActionListener(this);
}
num[0]=new Button(String.valueOf(0));
numberPanel.add(num[0]);
num[0].addActionListener(this);
for(int i=0;i<=6;i++)
{
operatorPanel.add(oper[i]);
oper[i].addActionListener(this);
}
}
public void actionPerformed(ActionEvent e)
{
String t=text.getText();
int len=t.length();
int[] nums=new int[2];
String oparator="";
for(int i=0;i<=9;i++)
{
if(e.getSource()==num[i])
text.setText(t+num[i].getLabel());
}
for(int i=2;i<6;i++)
{
if(e.getSource()==oper[i])
{text.setText(t+oper[i].getLabel());
oparator=oper[i].getLabel();
}
}
//清空
if(e.getSource()==oper[0])
{
text.setText(null);
}
//删去
if(e.getSource()==oper[1])
{
text.setText(t.substring(0,len-1));
}
//等于
if(e.getSource()==oper[6])
{
text.setText(this.calculator(t));
}
}
public String calculator(String t){
char lastoper='=';
char c;
char operator;
int num1;
int num2;
String num=" ";
String result;
Stack operstack=new Stack();
Stack numstack=new Stack();
operstack.push(new Character('='));
numstack.push(new Character('0'));
for(int i=0;i <t.length();i++)
{
c=t.charAt(i);
//情况一 数字
if(Character.isDigit(c))
{
num=num+String.valueOf(c);
}
//情况二 运算符
else if((c=='+')||(c=='-')||(c=='*')||(c=='/')||(c=='='))
{
if(!num.equals(" "))
{
numstack.push(new Integer(num));
num="";
char s=((Character)operstack.peek()).charValue();
while(getRual(s)>getRual(c))//比较优先权
{
operator=((Character)operstack.pop()).charValue();
num1=((Integer)numstack.pop()).intValue();
num2=((Integer)numstack.pop()).intValue();
numstack.push(cal(num1,num2,operator));
}
if(getRual(s)<=getRual(c))
{
operstack.push(new Character(c));
lastoper=c;
continue;
}
}
}
}
Enumeration items=operstack.elements();
while(items.hasMoreElements())
{
operator=((Character)operstack.pop()).charValue();
num1=((Integer)numstack.pop()).intValue();
num2=((Integer)numstack.pop()).intValue();
numstack.push(cal(num1,num2,operator));
}
result=((Integer)operstack.pop()).toString();
return result;
}
public static int getRual(char c)
{
switch(c)
{
case '+':return 1;
case '-':return 1;
case '*':return 2;
case '/':return 2;
case '=':return 0;
default: return -1;
}
}
public static int cal(int num1,int num2,char c)
{
switch(c)
{
case '+':return num1+num2;
case '-':return num1-num2;
case '*':return num1*num2;
case '/':return num1/num2;
default: return -1;
}
}
public static void main(String args[])
{
ComputerFrame demo=new ComputerFrame();
demo.setSize(300,400);
demo.show();
}