基于java swing实现四则运算器

一、GUI界面的实现

class CalculatorClass implements ActionListener{
    JFrame f;
    JPanel panel1,panel2,panel3,panel4,panel5,panel6,panel7;
    JTextArea area;;
    String []a= {"MC","7","8","9","/","%","(","4","5","6","*","x!",")","1","2","3","-",
            "ln","0","sin","cos",".","+","="};
    String []b= {"BackSpace","C"};
    JButton []Button1,Button2,Button3;
    CalculatorClass() throws IOException{
        f=new JFrame("Calculator");
        f.setLayout(new BorderLayout(0,0));
        panel1=new JPanel(new BorderLayout(0,0));
        panel1.isBackgroundSet();panel1.setBackground(Color.black);
        panel2=new JPanel(new GridLayout(4,6,10,10));
        panel3=new JPanel(new BorderLayout());
        panel4=new JPanel(new BorderLayout(0,0));
        panel5=new JPanel();
        panel5.setLayout(new FlowLayout(FlowLayout.LEFT));
        panel5.setSize(300,20);
        panel6=new JPanel();
        panel6.setBorder(BorderFactory.createRaisedBevelBorder());
        panel6.setBackground(Color.WHITE);
        panel7=new JPanel(new GridLayout(1,3,7,20));
        panel3.add(BorderLayout.WEST,panel6);
        panel3.add(BorderLayout.CENTER,panel7);
        panel3.setLayout(new FlowLayout(FlowLayout.CENTER));
        f.setSize(800, 700);
        f.add(BorderLayout.CENTER,panel1);
        area=new JTextArea(3,1);
        Font ziti = new Font("粗体",Font.BOLD,40);
        area.setFont(ziti);
        area.setLineWrap(true);
        panel4.add(BorderLayout.CENTER,area);
        String []c= {};
        Button3=new JButton[c.length];
        for(int i=0;i<c.length;i++) {
            Button3[i]=new JButton(c[i]);
            Button3[i].setMargin(new Insets(0,0,0,0));
            panel5.add(Button3[i]);
        }
        panel4.add(BorderLayout.NORTH,panel5);
        f.add(BorderLayout.NORTH,panel4);
        panel1.add(BorderLayout.CENTER,panel2);
        panel1.add(BorderLayout.NORTH,panel3);
        Font font1=new Font("粗体",Font.BOLD,35);
        Font font2=new Font("粗体",Font.BOLD,45);
        Button1=new JButton[a.length];
        Button2=new JButton[b.length];
        for(int i=0;i<a.length;i++) {
            Button1[i]=new JButton(a[i]);
            Button1[i].setMargin(new Insets(0,0,0,0));
            Button1[i].setBackground(Color.WHITE);
            Button1[i].setForeground(Color.BLACK);
            Button1[i].setFont(font2);
            Button1[i].addActionListener(this);
            panel2.add(Button1[i]);
        }
        panel2.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
        for(int i=0;i<b.length;i++) {
            Button2[i]=new JButton(b[i]);
            Button2[i].setMargin(new Insets(0,0,0,0));
            Button2[i].setBackground(Color.WHITE);
            Button2[i].setForeground(Color.red);
            Button2[i].setSize(250, 100);
            Button2[i].setFont(font1);
            Button2[i].addActionListener(this);
            panel7.add(Button2[i]);
        }
        f.setVisible(true);
    }

二、创建双栈

1、创建一个存储中间数据以及最终结果的栈

class Stack1 {
    ArrayList<Double> list = new ArrayList<>();
    public void push(Double o){
        list.add(o);
    }
    public int prior(char a)
    {
        if(a=='*'||a=='/')
            return 4;
        else if(a=='+'||a=='-')
            return 3;
        else if(a=='(')
            return 2;
        else if(a=='#')
            return 1;
        else
            return 0;
    }
    public Double getTop() {
        Double o = list.get(list.size() - 1);
        return o;
    }
    public Double pop(){
        Double o = list.get(list.size() - 1);
        list.remove(o);
        return o;
    }
    public void output(){
        System.out.println(list);
    }
}

2、创建一个存储运算符的栈

class Stack2 {
    ArrayList<Character> list = new ArrayList<>();
    public void push(Character o){
        list.add(o);
    }
    public Character getTop() {
        Character o = list.get(list.size() - 1);
        return o;
    }
    public boolean isEmpty() {
        if(list.isEmpty()) {
            return true;
        }
        else {
            return false;
        }
    }
    public Character pop(){
        Character o = list.get(list.size() - 1);
        list.remove(o);
        return o;
    }
    public void output(){
        System.out.println(list);
    }
}

三、括号匹配函数

boolean match(char str[])
    {
        Stack2 s=new Stack2();
        int k,flag=1;
        Character ch,e;
        for(k=0;k<str.length&&(flag==1);k++) {
            if(str[k]!='('&&str[k]!=')') {
                continue;
            }
            switch(str[k])
            {
                case '(': ch=str[k];s.push(ch);break;
                case ')':
                    if(!s.isEmpty()) {
                        e=s.getTop();
                        if(e=='(') {
                            ch=s.pop();
                        }
                        else
                            flag=0;
                    }
                    else {
                        flag=0;
                    }
                    break;
            }
        }
        if(flag==1&&s.isEmpty()) {
            return true;
        }
        else {
            return false;
        }
    }

四、计算函数

Double compute(char a2[]) {
        Stack1 L1=new Stack1();
        Stack2 L2=new Stack2();
        Character z,ch,y;
        char []a=new char[50];
        char []b=new char[50];
        char[]c=new char[50];
        Arrays.fill(b, '\0');
        Arrays.fill(c, '\0');
        Arrays.fill(a, '\0');
        int i,j=0,n,k=a2.length;
        double x1,x2,x;
        L2.push('#');
        System.arraycopy(a2, 0, a, 0, a2.length);
        a[k]='#';
        System.arraycopy(a, 0, b, 0, a.length);
        if(a[0]=='-') {
            for(n=0;a[n]!='\0';n++)
                b[n+1]=a[n];
            b[0]='0';
        }
        System.arraycopy(b, 0, a, 0, b.length);
        for(i=0;a[i]!='\0';i++) {
            if(a[i]=='('&&a[i+1]=='-') {
                for(n=i;a[n]!='\0';n++)
                    b[n+2]=a[n+1];
                b[i+1]='0';
            }
        }
        for(i=0;b[i]!='\0';i++)
        {
            if(b[i]>='0'&&b[i]<='9') {
                while(b[i]>='0'&&b[i]<='9'||b[i]=='.') {
                    c[j]=b[i];
                    i++;
                    j++;
                }
                char []d=new char[j];
                System.arraycopy(c, 0, d, 0, j);
                j=0;
                Double t=Double.parseDouble(new String(d));
                L1.push(t);
                Arrays.fill(c, '\0');
            }
            if(b[i]=='(') {
                Character t=b[i];
                L2.push(t);
            }
            if(b[i]==')') {
                do {
                    z=L2.pop();
                    try {
                        switch(z)
                        {
                            case '+':x2=L1.pop();x1=L1.pop();L1.push(x1+x2);break;
                            case '-':x2=L1.pop();x1=L1.pop();L1.push(x1-x2);break;
                            case '*':x2=L1.pop();x1=L1.pop();L1.push(x1*x2);break;
                            case '/':x2=L1.pop();x1=L1.pop();L1.push(x1/x2);break;
                        }
                    }catch(ArithmeticException e) {
                        area.append("\r\n"+"\t"+"分母!=0");
                    }
                    z=L2.getTop();
                }while(z!='(');
                z=L2.pop();
            }
            if(b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*') {
                ch=L2.getTop();
                if(L1.prior(b[i])>L1.prior(ch)) {
                    Character t=b[i];
                    L2.push(t);
                }
                else {
                    do {
                        ch=L2.pop();
                        try {
                            switch(ch)
                            {
                                case '+':x2=L1.pop();x1=L1.pop();L1.push(x1+x2);break;
                                case '-':x2=L1.pop();x1=L1.pop();L1.push(x1-x2);break;
                                case '*':x2=L1.pop();x1=L1.pop();L1.push(x1*x2);break;
                                case '/':x2=L1.pop();x1=L1.pop();L1.push(x1/x2);break;
                            }
                        }catch(ArithmeticException e) {
                            area.append("\r\n"+"\t"+"分母!=0");
                        }
                        ch=L2.getTop();
                    }while(L1.prior(ch)>=L1.prior(b[i]));
                    Character t=b[i];
                    L2.push(t);
                }
            }
            if(b[i]=='#') {
                y=L2.getTop();
                while(y!='#') {
                    y=L2.pop();
                    try {
                        switch(y)
                        {
                            case '+':x2=L1.pop();x1=L1.pop();L1.push(x1+x2);break;
                            case '-':x2=L1.pop();x1=L1.pop();L1.push(x1-x2);break;
                            case '*':x2=L1.pop();x1=L1.pop();L1.push(x1*x2);break;
                            case '/':x2=L1.pop();x1=L1.pop();L1.push(x1/x2);break;
                        }
                    }catch(ArithmeticException e) {
                        area.append("\r\n"+"\t"+"分母!=0");
                    }
                    y=L2.getTop();
                }
            }
        }
        x=L1.pop();
        return x;
    }

五、将函数与GUI界面监听结合

public void actionPerformed(ActionEvent e) {
        for(int i=0;i<a.length;i++) {
            if(e.getActionCommand()==a[i]&&i!=0&&i!=5&&i!=11&&i!=17&&i!=19&&i!=20) {
                area.append(a[i]);
            }
            else {
                continue;
            }
        }
        if(e.getActionCommand()=="BackSpace"&&(area.getText()).length()!=0) {
            area.setText(area.getText().substring(0, area.getText().length()-1));
        }
        if(e.getActionCommand()=="C") {
            area.setText("");
        }
        if(e.getActionCommand()=="=") {
            StringBuffer a=new StringBuffer(area.getText());
            a.deleteCharAt(a.length()-1);
            if(this.match(a.toString().toCharArray())) {
                Double m=this.compute(a.toString().toCharArray());
                double result=m;
                area.append("\r\n"+"\t\t\t\t"+String.format("%.5f", result));
            }
            else {
                area.append("\r\n"+"\t"+"括号不匹配!");
            }
        }
    }
}

六、界面展示

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值