使用栈实现简单的算数解析

使用栈完成简单的算数解析

       算法思路:构建两个栈,一个栈用来储存字符,另一个栈用来储存数字。

       储存字符的栈 s1 和储存数 的栈 s2。

       在计算阶段:

       从左到右依次进行解析。

      1:如果是数字就直接压入s2中

      2:如果是+或-,其优先级最低,如果s1中不为空,则拿出来进行计算之后在压入栈。

      3:如果是*或、,其优先级较高,如果s1中不为空,前一个字符是+或-的话就直接压入栈中,如果是*或/的话则把前一个字符拿出来计算之后在压入栈中

      4:如果是(,就直接压入栈中。

      5:如果是),就把到s1中的第一个(之前的运算符全部拿出做计算,之后在移除(。

    代码实现:

import java.util.AbstractList;
import java.util.Stack;
public class Teext5 {
	public static int evaluateExpression(String s){
		Stack <Character> s1 = new Stack<Character>();
		Stack <Integer> s2 = new Stack<Integer>();
		for(int i = 0; i < s.length(); i ++){
			int a = s.charAt(i);		
			if(a <= 57 && a >= 48){
				s2.push(a - 48);		
			}

			else if(s.charAt(i) == '+' || s.charAt(i) == '-'){
				if(s1.isEmpty() == false && 
						(s1.peek() == '+' || 
						s1.peek() == '-' || 
						s1.peek() == '*' ||
						s1.peek() == '/')){
					jisuan(s1, s2);
				}
				s1.push(s.charAt(i));
			}
			else if(s.charAt(i) == '*' || s.charAt(i) == '/'){
				if(s1.isEmpty() == false &&
						(s1.peek() == '*' ||
						s1.peek() == '/')){
					jisuan(s1, s2);
				}
				s1.push(s.charAt(i));
			}
			else if(s.charAt(i) == '('){
				s1.push(s.charAt(i));
			}
			else if(s.charAt(i) == ')'){
				while(s1.peek() != '(')
					jisuan(s1, s2);
				s1.pop();
			}
		}
		while(!s1.isEmpty()){
			jisuan(s1, s2);
		}
		return s2.peek();
	}
	private static void jisuan(Stack<Character> s1, Stack<Integer> s2){
		char c = s1.pop();
		int a1 = s2.pop();
		int a2 = s2.pop();
		int a;
		if(c == '+')
			s2.push(a1 + a2);
		if(c == '-')
			s2.push(a2 - a1);
		if(c == '*')
			s2.push(a1 * a2);
		if(c == '/')
			s2.push(a2 / a1);
	}
	public static void main(String args[]){
		String s = "1+2-5*(1+2)";
		int a = evaluateExpression(s);
		System.out.println(a);
	}
}


     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值