欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

通过栈实现简单综合计算器,使用字符串并不完善(中缀表达式)

程序员文章站 2022-12-20 08:23:20
文章目录前言一、思路分析二、代码实现总结前言我们如何通过使用栈来实现一个简单的综合计算器例如给出一个字符串“722-5+1-5+3-3”提示:以下是本篇文章正文内容,下面案例可供参考一、思路分析1.创建两个栈,一个用来存放数字,另外一个用来存放符号2.当我们进行扫描数组的时候,遇见数字直接存放进入数栈中,遇见符号则准备进入符号栈3.在符号栈中,假如栈为空则直接入栈,栈内有元素的话,则进行优先级的比较4.假如将入栈元素优先级小于等于栈顶元素,则弹出栈顶元素,并且数字栈pop出两个元素...


前言

我们如何通过使用栈来实现一个简单的综合计算器
例如给出一个字符串 “722-5+1-5+3-3”


提示:以下是本篇文章正文内容,下面案例可供参考

一、思路分析

1.创建两个栈,一个用来存放数字,另外一个用来存放符号
2.当我们进行扫描数组的时候,遇见数字直接存放进入数栈中,遇见符号则准备进入符号栈
3.在符号栈中,假如栈为空则直接入栈,栈内有元素的话,则进行优先级的比较
4.假如将入栈元素优先级小于等于栈顶元素,则弹出栈顶元素,并且数字栈pop出两个元素用此符号进行计算,如果入站元素优先级大于栈顶元素,则直接入栈
5.将计算后的结果压入数字栈
6.最后栈中的结果就为表达式结果

二、代码实现

public class Calutor{
//先创建字符串表达式将用于计算
public static void main(String args[]){
String expression="7*2*2-5+1-5+3-3";
Stack<String> numStack=new Stack<String>();//创建数字栈
Stack<String>operStack =new Stack<String>();//创建符号栈
//定义相关变量
int index=0;//用于扫描
char ch="";//每次扫描到字符存放进去
int res=0;//用来存放结果
int num1=0;//用来存放pop出的数字
int num2=0;//用来存放Pop出的数字
String str;//用来拼接多位数
char oper;//存放符号
while(true){
	//依次获得字符串的每一个字符
	ch=expression.substring(index,index+1).charAt(0);//将字符串切割后转换为char类型存放进入ch中
	//如果ch为符号,则开始判断栈中是否有元素,如果栈为空,直接将符号放入栈中,
	//如果栈内有元素,则与栈顶元素做优先级比较,优先级大则直接入栈,
	//优先级小,符号栈出元素直到栈顶元素小于将入栈元素
	if(isOper(ch)){
		if(operStack.isEmpty()!=null){
		operStack.push(ch);
			}else{
			//栈不为空的话
			//栈顶元素优先级<将入栈元素,则直接进栈
			if(prioity(operStack.peek())<prioity(ch)){
					operStack.push(ch);
				}else{
					//栈顶元素>入栈元素,弹出栈顶元素,数字栈弹出两个元素进行计算
					num1=num.pop();//注意:先弹出来的为后面的元素
					num2=num.pop();
					oper=ch;
					res=cal(num2,num1,oper);
					//将计算出的结果压入数字栈中
					numSatck.push(res);
					//将符号压入栈中
					operStack.push(ch);
				}
		
}else{
		//为数字的时候,我们要考虑到一个问题:多位数的时候,所以要进行一个拼接
		//什么时候停止拼接呢?
		//当Index后两位出现符号的时候则停止拼接/或者说当index到达了字符串的尾巴部位,停止拼接
		str+=ch;		
		if(index==expression.length()-1){
				numStack(Inter.parseInt(str));//将字符串转换为数字存入
			}else{
					//没有到达字符串的尾巴,则判断后两位为符号的时候停止拼接
					if(isOper(expression.substring(index+1,index+2).charAt(0))){
						//为符号的时候,停止拼接
						numStack.push(Integer.pareInt(str));
						//记得清空此字符串中的元素
						str="";
						}
		}
	index++;
	if(index>=expression.length()){
		break;
		}
//用取出来的元素进行计算
while(true){
		if(operStack.isEmpty()){
			break;
		}else{
					num1=num.pop();//注意:先弹出来的为后面的元素
					num2=num.pop();
					oper=ch;
					res=cal(num2,num1,oper);
					//将计算出的结果压入数字栈中
					numSatck.push(res);
			}
	
	}
	System.out.println("最终结果为"+numStack.pop());
}
//进行计算
public int cal(int num1,int num2,char ch){
	int res=0;
	switch(ch){
		case '+':
		res=num1+num2;
		break;
		case '-':
		res=num1-num2;
		break;
		case '*':
		res=num1*num2;
		break;
		case '/':
		res=num1/num2;
		break;
		
		}
return res;

}
//先设定一个方法,用来判断是不是符号
public boolean isOper(char ch){
	return ch=='+'||ch=='/'||ch=='*'||ch=='-';
	}
//判断符号优先级
public int prioity(char ch){
	switch(ch){
		case '+':
		return 1;
		break;
		case '-':
		return 1;
		break;
		case '*':
		return 2;
		break;
		case '/':
		return 2;
		break;
		}
	}
}

本文地址:https://blog.csdn.net/weixin_46452990/article/details/109630027