数组模拟栈并实现加减乘除运算
1.通过一个index值,来遍历我们的表达式
2.如果我们发现是一个数字,就直接入数栈
3.如果发现扫描到是一个符号,分如下情况
3.1如果发现当前符号栈为空,就直接入栈
3.2如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中pop出两个数,再从符号栈中pop出一个符号,进行运算,将得到的结果,入数栈,然后将当前的操作符入符号栈。如果当前的操作符的优先级大于或者等于栈中的操作符,就直接入符号栈
4.当表达式扫描完毕,就顺序的从数栈和符号栈中pop出相应的数和符号,并运行
5.最后在数栈中只有一个数字,就是表达式的结果
首先使用数组模拟栈结构:
public class ArrayStack {
private int maxSize;//栈的大小
private int[] stack;//数组,数组模拟栈,数据就放在数组中
private int top=-1;//top表示栈顶,初始化为-1
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack=new int[this.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 void list(){
if (isEmpty()){
System.out.println("栈空");
return;
}
//从栈顶显示数据
for (int i=top;i>=0;top--){
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 cal(int