花花生米

导航

计算器(栈、字符串)

题目:给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。

表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格  。 整数除法仅保留整数部分。

例子:
示例 1:

输入: "3+2*2"
输出: 7
示例 2:

输入: " 3/2 "
输出: 1
示例 3:

输入: " 3+5 / 2 "
输出: 5

import java.util.Scanner;
import java.util.Stack;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner (System.in);
		String s=in.nextLine();
		char[] sc=s.trim().toCharArray();//生成一个char数组,包含string的所有字符
		//弄栈
		Stack<Integer> st=new Stack();
		/**
		 * 如果碰到空格则i++继续
		 * 碰到数字则对数字进行入栈
		 * 碰到‘+’‘-’‘*’‘/’:
		 * 加则直接入栈
		 * 减则num=-num入栈//注意:这里不能用num-=num!!!
		 * *则num=stack.pop()*num入栈
		 *'/'则num=stack.pop()/num入栈
		 *最后相加栈里面的数值则欧克
		 */
		int ans=0,i=0;
		while(i<sc.length)
		{
			if(sc[i]==' ') {//从开始起考虑的空格
				i++;continue;
				}
			char tmp=sc[i];
			if(tmp=='*'||tmp=='/'||tmp=='+'||tmp=='-')
			{
				i++;
				while(i<sc.length&&sc[i]==' ')i++;//考虑运算符之后是否有空格
			}
			int num=0;
			//判断是否是数字,是true,否false
			while(i<sc.length&&Character.isDigit(sc[i])) {
				num=num*10+sc[i]-'0';
				i++;
			}
			switch(tmp)
			{
			case '-':
				num=-num;//注意这一步,不能采用num-=num;
				break;
			case '*':
				num=st.pop()*num;
				break;
			case '/':
				num=st.pop()/num;
				break;
			default:
				break;
			}
			st.push(num);
			
		}
		while(!st.empty())
			ans+=st.pop();
		System.out.println(ans);
	}

}

posted on 2020-10-01 12:30  花花生米  阅读(168)  评论(0编辑  收藏  举报