算术表达式求解的计算器(项目一源码)

链栈源码`

package 计算器;

import java.util.Iterator;

public class Stack<T> implements Iterable<T>{
    private Node head;
    private int N;

    public class Node{
        T data;
        Node next;
        public Node(T data,Node next){
            this.data=data;
            this.next=next;
        }
    }
    //构造方法
    public Stack(){
        this.head=new Node(null,null);
        this.N=0;
    }

    //判断当前栈的元素个数是否为0
    public boolean isEmpty(){
        return N==0;
    }

    //获取栈中元素个数
    public int size(){
        return N;
    }

    //把t元素压入栈(相当于链表的头插法)
    public void push(T t){
        //首结点指向的第一个元素
        Node first=head.next;
        Node newNode = new Node(t, null);
        //首结点指向新结点
        head.next=newNode;
        //新结点指向原来的第一节点first
        newNode.next=first;
        //元素个数加1
        N++;
    }

    //把元素弹出栈
    public T pop(){
        //找到首结点的下一个结点
        Node first=head.next;
        if(first==null){
            return null;
        }
        head.next=first.next;
        //元素个数-1
        N--;
        return first.data;
    }

    public T peek(){
        Node first=head.next;
        if(first==null){
            return null;
        }
        return first.data;
    }
    @Override
    public Iterator<T> iterator() {
        return new SIterator();
    }

    private class SIterator implements Iterator{

        private Node n;
        public SIterator(){
            this.n=head;
        }
        @Override
        public boolean hasNext() {
            return n.next!=null;
        }

        @Override
        public Object next() {
            n=n.next;
            return n.data;
        }
    }
}

计算器源码`

package 计算器;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.util.Objects;

public  class TEST {
    public static void  main(String[] args){
        JFrame jf = new JFrame("计算器");
        jf.setSize(600,500);
        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JPanel panel = new JPanel(null);
        JTextArea text = new JTextArea();
        text.setLocation(20,10);
        text.setSize(350,50);
        panel.add(text);

        JTextArea text_01 = new JTextArea();
        text_01.setBounds(20,70,350,50);
        panel.add(text_01);

        JTextArea text_03 = new JTextArea();
        text_03.setLocation(380,10);
        text_03.setSize(190,410);
        panel.add(text_03);

        JButton jb1 = new JButton("(");
        jb1.setBounds(20,130,50,50);
       jb1.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("(")){
                    String str = text.getText();
                    if(Objects.equals(str, "")){
                        text.append("()");
                    }
                    else {
                        if(str.charAt(str.length()-1) != '.' && str.charAt(str.length()-1) != ')' ){
                            text.append("(");
                        }
                    }
                }
            }
        });
        panel.add(jb1);

        JButton jb2 = new JButton(")");
        jb2.setBounds(95,130,50,50);
        jb2.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals(")")){
                    String str = text.getText();
                    for(int i=str.length()-1;i>=0;i--){
                        char x = str.charAt(i);
                        if(x == ')'){
                            break;
                        }
                        else {
                            if( x == '('){
                                text.append(")");
                            }
                        }
                    }
                }
            }
        });
        panel.add(jb2);

        JButton jb3 = new JButton("%");
        jb3.setBounds(170,130,50,50);
        panel.add(jb3);
        jb3.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("%")){
                    String str = text.getText();
                    if(issames(str)){
                        text.append("%");
                    }
                }
            }
        });

        JButton jb4 = new JButton("BACKSP");
        jb4.setBounds(245,130,125,50);
        panel.add(jb4);
        jb4.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("BACKSP")){
                    String str = text.getText();
                    text.setText("");
                    str = str.substring(0, str.length() - 1);
                    text.append(str);
                }
            }
        });



        JButton jb6 = new JButton("1");
        jb6.setBounds(20,190,50,50);
        panel.add(jb6);
        jb6.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("1")){
                    text.append("1");
                }
            }
        });


        JButton jb7 = new JButton("2");
        jb7.setBounds(95,190,50,50);
        panel.add(jb7);
        jb7.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("2")){
                    text.append("2");
                }
            }
        });

        JButton jb8 = new JButton("3");
        jb8.setBounds(170,190,50,50);
        panel.add(jb8);
        jb8.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("3")){
                    text.append("3");
                }
            }
        });

        JButton jb9 = new JButton("+");
        jb9.setBounds(245,190,125,50);
        panel.add(jb9);
        jb9.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("+")){
                    String str = text.getText();
                    if(issames(str)){
                        text.append("+");
                    }
                }
            }
        });

        JButton jb11 = new JButton("4");
        jb11.setBounds(20,250,50,50);
        panel.add(jb11);
        jb11.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("4")){
                    text.append("4");
                }
            }
        });

        JButton jb12 = new JButton("5");
        jb12.setBounds(95,250,50,50);
        panel.add(jb12);
        jb12.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("5")){
                    text.append("5");
                }
            }
        });

        JButton jb13 = new JButton("6");
        jb13.setBounds(170,250,50,50);
        panel.add(jb13);
        jb13.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("6")){
                    text.append("6");
                }
            }
        });

        JButton jb15 = new JButton("C");
        jb15.setBounds(245,250,125,50);
        panel.add(jb15);
        jb15.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("C")){
                    text.setText("");
                    text_01.setText("");
                }
            }
        });

        JButton jb16 = new JButton("7");
        jb16.setBounds(20,310,50,50);
        panel.add(jb16);
        jb16.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("7")){
                    text.append("7");
                }
            }
        });

        JButton jb17 = new JButton("8");
        jb17.setBounds(95,310,50,50);
        panel.add(jb17);
        jb17.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("8")){
                    text.append("8");
                }
            }
        });

        JButton jb18 = new JButton("9");
        jb18.setBounds(170,310,50,50);
        panel.add(jb18);
        jb18.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (e.getActionCommand().equals("9")){
                    text.append("9");
                }
            }
        });

        JButton jb19 = new JButton("-");
        jb19.setBounds(245,310,50,50);
        panel.add(jb19);
        jb19.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("-")){
                    String str = text.getText();
                    if(Objects.equals(str, "")){
                        text.append("-");
                    }
                    else {
                        if(issames(str) || str.charAt(str.length()-1) == ')'){
                            text.append("-");
                        }
                    }
                }
            }
        });

        JButton jb21 = new JButton(".");
        jb21.setBounds(20,370,50,50);
        panel.add(jb21);
        jb21.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (e.getActionCommand().equals(".")) {
                    String str = text.getText();
                    char c = str.charAt(str.length() - 1);
                    if (c >= '0' && c <= '9') {
                        for (int i = str.length() - 1; i >= 0; i--) {
                            char c_1 = str.charAt(i);
                            boolean swr = (c_1 >= '0' && c_1 <= '9');
                            if (!swr) {
                                if (str.charAt(i) != '.') {
                                    text.append(".");
                                    break;
                                }
                            }
                            if (i == 0) {
                                text.append(".");
                            }
                        }
                    }
                }
            }
        });

        JButton jb22 = new JButton("0");
        jb22.setBounds(95,370,50,50);
        panel.add(jb22);
        jb22.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("0")){
                    text.append("0");
                }
            }
        });

        JButton jb23 = new JButton("/");
        jb23.setBounds(170,370,50,50);
        panel.add(jb23);
        jb23.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("/")){
                    String str = text.getText();
                    if(issames(str)){
                        text.append("/");
                    }
                }
            }
        });

        JButton jb24 = new JButton("*");
        jb24.setBounds(245,370,50,50);
        panel.add(jb24);
        jb24.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getActionCommand().equals("*")){
                    String str = text.getText();
                    if(issames(str)){
                        text.append("*");
                    }
                }
            }
        });

        JButton jb25 = new JButton("=");
        jb25.setBounds(320,310,50,110);
        panel.add(jb25);
        jb25.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                text_01.setText("");
                String Arithmetic = text.getText();
                text_01.append(Arithmetic);
                text_03.append("\n" + Arithmetic);
                text.setText("");
                Stack<Character> OP = new Stack<Character>();
                Stack<Double> OPnd = new Stack<Double>();
                OP.push('#');
                char[] Operation_characters = Arithmetic.toCharArray();
                for (int i =0; i < Arithmetic.length(); i++) {
                    if(Operation_characters[i] == '('){//左括号直接入栈
                        OP.push(Operation_characters[i]);
                    }
                    else {
                        if (issames(Operation_characters[i])) {//判断是否是数字或者小数点
                            String x_1 = "";
                            x_1 = x_1 + Operation_characters[i];
                            double y_1;
                            for (int j = i+1; j < Arithmetic.length(); j++) {//把数double 数压入OPnd栈里面
                                if(j ==Arithmetic.length()-1){
                                    if (issames(Operation_characters[j])){
                                        x_1 = x_1 + Operation_characters[j];
                                        i=j;
                                    }
                                    else {
                                        i = j-1;
                                        break;
                                    }

                                }else {
                                    if (issames(Operation_characters[j])) {
                                        x_1 = x_1 + Operation_characters[j];
                                    }
                                    else {
                                        i = j-1;
                                        break;
                                    }
                                }
                            }
                            y_1 = Double.parseDouble(x_1);
                            OPnd.push(y_1);
                        }
                        else {
                            if(isop(Operation_characters[i])){//判断是否是运算符
                                char op = OP.peek();
                                boolean po = Compare_priorities(Operation_characters[i], op);//比较当前操作符和OP的栈顶元素的优先级大小
                                if (Operation_characters[i] == ')') {//先处理)
                                    while (OP.peek() != '(') {
                                        double s1 = OPnd.peek();
                                        OPnd.pop();
                                        double s2 = OPnd.peek();
                                        OPnd.pop();
                                        char c = OP.peek();
                                        OP.pop();
                                        //将结果压栈
                                        OPnd.push(operation(s2, s1, c));
                                    }
                                    OP.pop();//把(弹出OP栈
                                }
                                else {
                                    if (po) {
                                        OP.push(Operation_characters[i]);//优先级高于栈顶入OP栈
                                    }
                                    else {
                                        if(OP.peek() == '#'){
                                            break;
                                        }
                                        else {
                                            double s1 = OPnd.peek();
                                            OPnd.pop();
                                            double s2 = OPnd.peek();
                                            OPnd.pop();
                                            char c = OP.peek();
                                            OP.pop();
                                            //将结果压栈
                                            OPnd.push(operation(s2, s1, c));
                                            OP.push(Operation_characters[i]);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                while (OP.peek() != '#') {
                    //取两个操作数和一个操作符计算
                    double s1 = OPnd.peek();
                    OPnd.pop();
                    double s2 = OPnd.peek();
                    OPnd.pop();
                    char c = OP.peek();
                    OP.pop();
                    //将结果压栈
                    OPnd.push(operation(s2, s1, c));
                }


                double result =OPnd.peek();
                OPnd.pop();
                text.append(String.valueOf(result));
                text_03.append("\n" + String.valueOf(result));

            }

        });


        jf.add(panel);
        jf.setVisible(true);
    }

    /**
     * 判断str的最后一个是否为数字或右括号
     * @param str 字符串
     * @return 是返回false否则返回true
     */
    public static boolean issames(String str){
        char[] Operation_characters = str.toCharArray();
        return (Operation_characters[str.length() - 1] >= '0' && Operation_characters[str.length() - 1] <= '9') || Operation_characters[str.length()-1] == ')' ;
    }

    /**
     * 判断是否是数字和小数点
     * @param str 字符串
     * @return 是返回true,否则false
     */
    public static boolean issames(char str){
        return (str >= '0' && str <= '9') || str == '.';
    }

    /**
     * 判断优先级
     * @param x 运算符
     * @return 返回int形,即运算符x的优先级
     */
    public static int priorities(char x){
        if(x == '+' || x== '-' ){
            return 1;
        } else if (x == '*' || x== '/' || x == '%') {
            return 2;
        } else if (x == '(') {
            return 0;
        } else if (x == ')') {
            return 0;
        } else if (x == '#') {
            return -1;
        }
        return 4;
    }

    /**
     *判断优先级大小,x大于y返回true
     * @param x 运算符
     * @param y 运算符
     * @return x的优先级大于y返回true;否则false
     */
    public static boolean Compare_priorities(char x,char y){
        int a = priorities(x);
        int b = priorities(y);
        if(x=='(' && y=='('){
            return false;
        }
        else {
            return a > b || a == b;
        }
    }

    /**
     * 判断字符是否是运算符
     * @param c 字符
     * @return 是返回true,否则返回false
     */
    public  static boolean isop(char c)
    {
        return c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == '#' || c == '%';
    }

    /**
     * 求数1 运算符 数2 的结果
     * @param str1 数1
     * @param str2 数2
     * @param x 运算符
     * @return 结果
     */
    public static Double operation(double str1,double str2,char x){
        double result = 0.00;
        double a = str1;
        double b = str2;
        int c=0,d=0,e=0,f=0;//用来解决两个double数相乘出现很多小数点的问题
        String str = String.valueOf(str1);
        String str_1 = String.valueOf(str2);
        for(int i=0;i<str.length();i++){
            if(str.charAt(i) == '.'){
                d = i;
                break;
            }
        }
        c= (int)(a*mi(d));
        for(int i=0;i<str_1.length();i++){
            if(str_1.charAt(i) == '.'){
                f = i;
                break;
            }
        }
        e = (int)(b*mi(f));
        if (x == '+') {
            result = a + b;
        } else if (x == '-') {
            result = a - b ;
        } else if (x == '*') {
            result = (double) c * e /mi(d+f);
        } else if (x == '/') {
            result = a / b;
        } else if (x == '%') {
            result = a % b;
        }
        return result;
    }

    /**
     * 求10的k次幂
     * @param k 幂
     * @return 10的k次幂
     */
    public static int mi(int k){
        int x = 1;
        for(int i=0;i<k;i++){
            x = x*10;
        }
        return x;
    }



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值