一、栈(stack)实现综合计算器的思路分析
1、代码
package com.rf.springboot01.dataStructure.stack.calculatorStack;
/**
* @description: 栈(stack)实现综合计算器
* @author: xiaozhi
* @create: 2020-07-27 13:45
*/
public class Calculator {
public static void main(String[] args) {
//定义一个表达式
String expre = "70+2*6-2";
int res=getResult(expre);
System.out.printf("表达式 %s=%d",expre,res);
}
/**
* @Description: 计算器获取运算结果方法
* @Param: [expre]
* @Author: xz
* @return: int
* @Date: 2020/7/27 22:13
*/
public static int getResult(String expre){
//创建一个数栈,一个符号栈
CalculatorArrayStack numStack = new CalculatorArrayStack(10);
CalculatorArrayStack operStack = new CalculatorArrayStack(10);
int index=0;//用于扫描
int num1=0;//定义第一个数
int num2=0;//定义第二个数
int oper=0;//定义操作符
int result = 0;//定义返回结果
char ch = ' ';//将每次扫描得到char保存到ch
String keepNum = ""; //用于拼接 多位数
//开始while循环的扫描expression
while(true){
//依次得到expre的每一个字符
ch=expre.substring(index,index+1).charAt(0);
if(operStack.isOper(ch)){//是运算符
if(!operStack.isEmpty()){//符号栈不为空
//操作符的优先级小于或者等于栈中的操作符
if(operStack.priority(ch)=expre.length()){
break;
}
}
//当表达式扫描完毕,就顺序的从 数栈和符号栈中pop出相应的数和符号,并运行.
while(true){
//如果符号栈为空,则计算到最后的结果, 数栈中只有一个数字【即结果】
if(operStack.isEmpty()){
break;
}
num1=numStack.pop();
num2=numStack.pop();
oper=operStack.pop();
result=numStack.compute(num1,num2,oper);
numStack.push(result);//入栈
}
//将数栈的最后数,pop出,就是结果
return numStack.pop();
}
}
/**
* @Description: 定义一个数组栈
* @Param:
* @Author: xz
* @return:
* @Date: 2020/7/27 22:45
*/
class CalculatorArrayStack{
private int maxSize;//栈的最大值
private int[] stack; //数组类型的栈
private int top=-1;//栈顶
public CalculatorArrayStack(int maxSize){
this.maxSize=maxSize;
stack=new int[maxSize];//数组类型的栈初始化
}
//栈是否已满
public boolean isFull(){
return top==maxSize-1;
}
//栈是否为空
public boolean isEmpty(){
return top==-1;
}
//入栈
public void push(int value){
if(isFull()){
System.out.println("栈已满");
return;
}
top++;
stack[top]=value;
}
//出栈
public int pop(){
if(isEmpty()){
throw new RuntimeException("栈为空");
}
int value=stack[top];//获取到栈顶的值
top--;
return value;
}
//显示栈顶的值,不出栈
public int peek(){
return stack[top];
}
//遍历栈,从栈顶开始显示数据
public void list(){
if(isEmpty()){
throw new RuntimeException("栈为空");
}
for(int i=top;i>=0;i--){
System.out.printf("stack[%d]=%d \n",i,stack[i]);
}
}
//返回运算符的优先级,优先级自己确定(数字越大,则优先级就越高)
//假定目前的表达式只有 +, - , * , /
public int priority(int oper){
if(oper == '*' || oper== '/'){
return 1;
}else if(oper == '+'|| oper == '-'){
return 0;
}else {
return -1;
}
}
//判断是否是一个运算符
public boolean isOper(char val){
return val=='*' || val=='/' || val=='+'|| val== '-';
}
//计算方法
public int compute(int num1,int num2,int oper){
int result=0;
switch(oper){
case '+':
result=num1+num2;
break;
case '-':
result=num2-num1;
break;
case '*':
result=num1*num2;
break;
case '/':
result=num1/num2;
break;
default:
break;
}
return result;
}
}