基本计算器

本文详细解析了一个简单计算器的实现过程,使用双栈结构处理字符串表达式中的数字、加减运算符及括号,通过具体示例展示了算法的运行流程。

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

题目描述

实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。

示例

示例 1:

  • 输入: “1 + 1”
  • 输出: 2

示例2:

  • 输入: " 2-1 + 2 "
  • 输出: 3

示例 3:

  • 输入: “(1+(4+5+2)-3)+(6+8)”
  • 输出: 23

题解

我的妈呀这个题提交了n次终于通过了。没有想到特殊情况比如输入是这种“ 33”或者(33)或者1-(33)。
设置两个栈,一个数据栈存储数据,一个符号栈存储符号。
当符号是’)‘并且符号栈的大小大于1时,则在遇到符号栈栈顶元素是’('之前,打印符号栈栈顶元素,对数据栈中的数据计算,并将计算结果push到数据栈中;如果当前符号是‘+’或者‘-’并且符号栈顶元素是‘-’时,则需要抛出符号栈栈顶元素,以及数据栈中的前两个栈顶元素将计算结果push到数据栈中,再将当前符号push到符号栈中;如果符号栈栈顶元素不是‘-’,则直接将当前符号push到符号栈中;若当前符号是‘(’直接push;若当前符号是‘ ’,则继续循环;若当前符号是数字,则判断该字符后的几位是否都是数字,知道不是数字结束,将数字字符串转换成整型push到数据栈中。
字符串遍历结束,首先判断符号栈在栈顶元素不是‘(’的情况下是否为空,若不为空则对数据栈中的数据计算,计算结果push到数据栈;
最后返回数据栈中的栈顶元素。

public int calculate(String s) {
		Stack<Integer> data=new Stack<>();
		Stack<Character> ch=new Stack<>();
		for(int i=0;i<s.length();i++) {
			if(s.charAt(i)=='(') {
				ch.push('(');
			}else if(s.charAt(i)=='+') {
				if(!ch.isEmpty()&&ch.peek()=='-') {
					ch.pop();
					int num1=data.pop();
					int num2=data.pop();
					int num=num2-num1;
					data.push(num);
				}
				ch.push('+');
			}else if(s.charAt(i)=='-') {
				if(!ch.isEmpty()&&ch.peek()=='-') {
					ch.pop();
					int num1=data.pop();
					int num2=data.pop();
					int num=num2-num1;
					data.push(num);
				}
				ch.push('-');
			}else if(s.charAt(i)==' ') {
				continue;
			}else if(s.charAt(i)==')') {
				
				if(ch.size()==1&&ch.peek()=='(')
					continue;
				else {
					while(ch.peek()!='(') {
						int num1=data.pop();
						int num2=data.pop();
						int num=0;
						char c=ch.pop();
						if(c=='+') {
							num=num1+num2;
						}else if(c=='-') {
							num=num2-num1;
						}
						data.push(num);
					}
					ch.pop();
				}
			}else {
				int index=i;
				i++;
				while(i<s.length()&&s.charAt(i)!='('&&s.charAt(i)!='+'&&s.charAt(i)!='-'
						&&s.charAt(i)!=')'&&s.charAt(i)!=' ') {
					i++;
				}
				data.push(Integer.parseInt(s.substring(index,i)));
				i--;
			}	
		}
		while(!ch.isEmpty()&&ch.peek()!='(') {
			int num1=data.pop();
			int num2=data.pop();
			int num=0;
			char c=ch.pop();
			if(c=='+')
				num=num1+num2;
			else if(c=='-')
				num=num2-num1;
			data.push(num);
		}
		while(!data.isEmpty())
			return data.pop();
        return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值