代码总结 如何编写一个基本计算器

概述

对Leetcode中的基本计算器的总结

只能计算加减的

public static int cal(String str){
        Stack<Integer> stack=new Stack<>();
        String sign="+";
        int curnum=0;
        boolean hasNum=false;
        for(int i=0;i<str.length();i++)
        {
            char temp=str.charAt(i);
            if(Character.isDigit(temp))
            {
                curnum=curnum*10+(temp-'0');
            }else if(temp!=' ')
            {
                if(sign.equals("+"))
                {
                    stack.push(curnum);
                }else if(sign.equals("-"))
                {
                    stack.push(curnum*-1);
                }
                sign=String.valueOf(temp);
                curnum=0;
            }
        }
        if(sign.equals("+"))
        {
            stack.push(curnum);
        }else if(sign.equals("-"))
        {
            stack.push(curnum*-1);
        }
        return 0;
    }

加减乘除,不带括号

import java.util.Stack;
class Solution {

    public int calculate(String str)
    {
        Stack<Integer> stack=new Stack<>();
        int curnum=0;
        String sign="+";
        for(int i=0;i<str.length();i++)
        {
            char temp=str.charAt(i);
            if(Character.isDigit(temp))
            {
                curnum=curnum*10+temp-'0';
            }
            if((!Character.isDigit(temp)&&temp!=' ')||i==str.length()-1)
            {
                if(sign.equals("+"))
                {
                    stack.push(curnum);
                }else if(sign.equals("-"))
                {
                    stack.push(curnum*-1);
                }
                else if(sign.equals("*"))
                {
                    int t=stack.pop();
                    curnum=t*curnum;
                    stack.push(curnum);
                }
                else if(sign.equals("/"))
                {
                    int t=stack.pop();
                    curnum=t/curnum;
                    stack.push(curnum);
                }
                curnum=0;
                sign=String.valueOf(temp);
            }
        }
        int res=0;
        for(Integer i:stack)
        {
            res+=i;            
        }
        return res;
    }


    public static int calculate2(String s) {
        Stack<String> stack=new Stack<>();
        char[] chars = s.toCharArray();
        int curnum=0;
        boolean hasNum=false;
        for(int i=0;i<chars.length;i++)
        {
            if(chars[i]>='0'&&chars[i]<='9')
            {
                curnum=curnum*10+chars[i]-'0';
                hasNum=true;
            }else if(chars[i]!=' ')
            {
                if(hasNum)
                {
                    if(!stack.isEmpty()&&(stack.peek().equals("*")||stack.peek().equals("/")))
                    {
                        String point=stack.pop();
                        int tempnum=Integer.parseInt(stack.pop());
                        if(point.equals("*"))
                        {
                            stack.push(String.valueOf(tempnum*curnum));
                        }else
                        {
                            stack.push(String.valueOf(tempnum/curnum));
                        }
                    }else
                    {
                        stack.push(String.valueOf(curnum));
                    }
                    curnum=0;
                    hasNum=false;
                }
                stack.push(String.valueOf(chars[i]));
            }
        }
        if(hasNum)
        {
            if(!stack.isEmpty()&&(stack.peek().equals("*")||stack.peek().equals("/")))
            {
                String point=stack.pop();
                int tempnum=Integer.parseInt(stack.pop());
                if(point.equals("*"))
                {
                    stack.push(String.valueOf(tempnum*curnum));
                }else
                {
                    stack.push(String.valueOf(tempnum/curnum));
                }
            }else
            {
                stack.push(String.valueOf(curnum));
            }
        }
        int res=0;
        boolean flag=true;
        for(String str:stack)
        {
             if(str.equals("+"))
            {
                flag=true;
            }else if(str.equals("-"))
            {
                flag=false;
            }else
            {
               if(flag) res+=Integer.parseInt(str);
               else res-=Integer.parseInt(str);
            }
        }
        return res;
    }
}

完整的代码

 public static int calculate(String str)
    {
        Stack<Integer> stack=new Stack<>();
        int[] res = cal(str, 0);
        return res[0];
    }
    public static int[] cal(String str,int index)
    {
        Stack<Integer> stack=new Stack<>();
        int curnum=0;
        String sign="+";
        int i=index;
        for(;i<str.length();i++)
        {
            char temp=str.charAt(i);
            if(Character.isDigit(temp))
            {
                curnum=curnum*10+temp-'0';
            }
            if((!Character.isDigit(temp)&&temp!=' ')||i==str.length()-1)
            {
                if(temp=='(')
                {
                    int[] arr=cal(str,i+1);
                    curnum=arr[0];
                    if(curnum==-4)
                        System.out.println(curnum);
                    i=arr[1]+1;
                }
                if(sign.equals("+"))
                {
                    stack.push(curnum);
                }else if(sign.equals("-"))
                {
                    stack.push(curnum*-1);
                }
                else if(sign.equals("*"))
                {
                    int t=stack.pop();
                    curnum=t*curnum;
                    stack.push(curnum);
                }
                else if(sign.equals("/"))
                {
                    int t=stack.pop();
                    curnum=t/curnum;
                    stack.push(curnum);
                }
                if(i==str.length()-1||temp==')')
                    break;
                curnum=0;
                sign=String.valueOf(temp);
            }
        }
        int res=0;
        for(Integer t:stack)
        {
            res+=t;
        }
        return new int[]{res,i};
    }
代码总结 文章被收录于专栏

典型的代码,以及自己的想法

全部评论

相关推荐

点赞 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1151501次浏览 17149人参与
# 通信和硬件还有转码的必要吗 #
11201次浏览 101人参与
# OPPO开奖 #
19200次浏览 267人参与
# 和牛牛一起刷题打卡 #
18963次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203374次浏览 3625人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4972次浏览 30人参与
# 不去互联网可以去金融科技 #
20360次浏览 255人参与
# 通信硬件薪资爆料 #
265899次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2220次浏览 34人参与
# 互联网公司评价 #
97682次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25035次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454856次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53901次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14644次浏览 349人参与
# 硬件人的简历怎么写 #
82285次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19397次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28083次浏览 248人参与
# 学历对求职的影响 #
161234次浏览 1804人参与
# 你收到了团子的OC了吗 #
538703次浏览 6386人参与
# 你已经投递多少份简历了 #
344206次浏览 4963人参与
# 实习生应该准时下班吗 #
96974次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63523次浏览 622人参与
牛客网
牛客企业服务