用栈写计算器

package tu;

import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Main1 arr=new Main1(10);
		String exper = "111+111*6555";
		Main1 oper=new Main1(10);
		int index=0;//用于扫描
		int num1=0;
		int num2=0;
		int opers=0;//运算符
		int res=0;//结果
		char ch=' ';//将每次扫描的char存放到ch中
		String keep="";
		while(true) {
			
			//一次得到字符串的每个字符
			ch = exper.substring(index,index+1).charAt(0);
			//判断ch是什么然后做相应的处理
			if(oper.isOper(ch)) {//如果是一个运算符
				//看他是否为空
				if(oper.txet()!=-1) {
					//如果符合栈有操作符就进行比较如果当前操作符的优先级小于或者等于栈的操作符就要pop出两个数
					if(oper.first(ch)<=oper.first(oper.peek())) {
						num1=arr.pop();
						num2=arr.pop();
						opers=oper.pop();
						res = arr.cal(num1, num2, opers);
						//把运算的结果如数栈
						arr.push(res);
						//入完栈后把当前操作符入栈
						oper.push(ch);
					}else {
						//如果当前的操作符的优先级大于栈中的操作符,就直接如符号栈
						oper.push(ch);
					}
				}else {
					//人如果为空直接入符合栈
					oper.push(ch);//1 + 3
				}
				
				
			}else {//如果是数直接入数栈
				
				keep+=ch;
				if(index==exper.length()-1) {
					arr.push(Integer.parseInt(keep));
				}else {
					if(oper.isOper( exper.substring(index+1,index+2).charAt(0))) {
						//如果最后一位是运算符,则入栈
						arr.push(Integer.parseInt(keep));
						keep="";
					}
				}
				
					
				
				
			}
			//让index+1,判断是否扫描到这个字符串的最后
 			index++;
			if(index >= exper.length()) {
				break;  
				
			}
		}
		
		//当表达式扫描完毕,就顺序的从数栈和符号栈中的pop出相应的数符合运行。
		while(true) {
			//如果符合栈为空,则计算到最后的结果,数栈中只有一个数字【结果】
			if(oper.txet()==-1) {
				break; 
			}
			num1=arr.pop();
			num2=arr.pop();
			opers=oper.pop();
			res=arr.cal(num1, num2, opers);
			arr.push(res);
		}
		System.out.println(arr.pop());
	}


}
class Main1 {
	private int s1;
	private int []arr;
	public Main1(int sum) {
		s1=-1;
		arr=new int[sum];
	}
	public int peek() {//返回当前栈顶的值
		return arr[s1];
	}
	public void push(int a) {
		arr[++s1]=a;
	}
	public int pop() {
		return arr[s1--];
	}
	public int txet() {
		int a =0;
		if(s1==-1) {
			a=-1;
		}
			
		return  a;
	}

	//返回运算符的优先级, 优先级使用数字表示,数字越大则优先级就越高 优先级是由程序员自定的
	public int first(int oper) {
		if(oper =='*'||oper=='/') {
			return 1;
		}else if(oper=='+'||oper=='-') {
			return 0;
		}else {
			return -1;//目前计算里面只含有加减乘除其他返回-1
		}
	}
	public boolean isOper(char val) {
		return val =='+'||val=='-'||val =='*'||val=='/';
	}
	public int cal(int num1,int num2,int oper) {
		int res = 0;//用于存放计算结果
		switch(oper) {
		case'+':
			res=num1+num2;
			break;
		case'-':
			res=num2-num1;//后面减前面
			break;
		case'*':
			res=num1*num2;
			break;
		case'/':
			res=num2/num1;//后面减前面
			break;
		default:
			break;
		}
		return res;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值