[LeetCode]224. Basic Calculator

本文介绍了一个简单的表达式计算器实现,该计算器能够解析并计算包含加减运算及括号的数学表达式。通过使用两个栈——数字栈和符号栈,算法能正确处理运算优先级和括号嵌套。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23

思路:有两个栈,一个栈为数字栈存放数和‘(’,另一个栈为符号栈存放符号

从字符串第一位开始判断,

如果为空,则跳过

如果为‘+’、‘-’压入符号栈

如果为‘)’,则从数字栈中取出一个数字,并且弹出‘(’,进行判断

如果为数字则循环直到符号或空格找到所有数字,

如果当前数字栈为空或者最上层为‘(’则直接压入数字栈

否则说明可以进行运算,则从符号栈中取出一个符号,从数字栈中取出一个数字,进行计算后放入数字栈

最后结果虽然AC,但是时间并不理想

public class Solution {
    public int calculate(String s) {
		Stack<String> numberStack=new Stack<String>();
		Stack<Character> signStack=new Stack<Character>();
        for(int i=0;i<s.length();i++){
        	char c=s.charAt(i);
        	if(c!=' '){
        		if(c=='('){
        			numberStack.push(String.valueOf(c));
        		}else if(c==')'){
        			String aa=numberStack.pop();
        			numberStack.pop();
        			if(numberStack.isEmpty()||numberStack.peek().equals("(")){
        				numberStack.push(aa);
        			}else{
        				int b=Integer.valueOf(numberStack.pop());
        				int a=Integer.valueOf(aa);
        				char sign=signStack.pop();
        				if(sign=='+'){
        					String re=String.valueOf(b+a);
        					numberStack.push(re);
        				}else{
        					String re=String.valueOf(b-a);
        					numberStack.push(re);
        				}
        			}
        		}else if(c=='+'||c=='-'){
        			signStack.push(c);
        		}else{
        			String ss="";
        			int index=i;
        			while(index<s.length()&&s.charAt(index)>='0'&&s.charAt(index)<='9'){
        				ss+=s.charAt(index);
        				index++;
        			}
        			i=index-1;
        			//System.out.println(ss);
        			//System.out.println(numberStack);
        			if(numberStack.isEmpty()||numberStack.peek().equals("(")){
        				numberStack.push(ss);
        			}else{
        				int b=Integer.valueOf(numberStack.pop());
        				int a=Integer.valueOf(ss);
        				char sign=signStack.pop();
        				if(sign=='+'){
        					String re=String.valueOf(b+a);
        					numberStack.push(re);
        				}else{
        					String re=String.valueOf(b-a);
        					numberStack.push(re);
        				}
        			}
        		}
        	}
        }
        return Integer.valueOf(numberStack.pop());
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值