Java用栈实现综合计算器
栈
栈(stack)又名堆栈,它是一种运算受限的线性表 。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
概念随便一看,反正就是先进后出的一种数据结构,什么是栈这里不做赘述,下面看一下如何在Java中,利用数组实现模拟一个栈。
Java实现栈
可以用数组来简单的模拟出一个栈的结构。
栈一共两个操作,入栈和出栈
我们只需要一个指针指向栈顶即可完成:
1.出栈的时候将栈顶指针指向的数据取出,指针左移一位指向新的栈顶数据
2.入栈的时候将栈顶指针后移一位,新的栈顶数据放入指针所在位置
注意:当然,由于数组存储空间是定长的,需要指定栈的大小,出入栈也需要判断栈空、栈满
用类ArrayStack作为栈对象
1.属性maxSize存放栈的大小,用于判断栈是否满
2.属性stack[]是用于存放栈的数组
3.top指针指向栈顶,初始化指向-1(因为入栈要先后移)
4.方法有——查看栈顶数据、判断栈是否空、判断栈是否满、入栈、出栈、打印栈
代码如下:
class ArrayStack{
/**
* 栈的大小
*/
private int maxSize;
/**
* 数组,模拟栈
*/
private int[] stack;
/**
* top表示栈顶数据所在数组位置的下标,初始化为-1
*/
private int top = -1;
/**
* 构造器,初始化栈
* @param maxSize 栈的大小
*/
public ArrayStack(int maxSize){
this.maxSize = maxSize;
stack = new int[maxSize];
}
/**
* 返回当前栈顶的值,不出栈
* @return 当前栈顶的值
*/
public int topData(){
return stack[top];
}
/**
* 判断栈是否满
*/
public boolean isFull(){
return top==maxSize-1;
}
/**
* 判断栈是否空
*/
public boolean isNull(){
return top==-1;
}
/**
* 入栈
* @param data 入栈的数据
*/
public void push(int data){
//先判断栈是否是满的
if (isFull()){
//如果是满的,打印错误,直接返回
System.out.println("栈已满");
return;
}
//栈没满,入栈
// top++;stack[top]=data;
stack[++top] = data;
}
/**
* 出栈
* @return 返回栈顶数据
*/
public int pop(){
//先判断栈是否为空
if (isNull()){
//如果为空,抛出异常
throw new RuntimeException("栈为空,没有可出栈数据");
}
//不为空执行出栈
return stack[top--];
}
/**
* 显示栈的情况,从栈顶显示到栈底
*/
public void showStack(){
//先判断是否为空栈
if (isNull()){
System.out.println("栈为空,没有数据");
return;
}
//遍历显示栈
for (int i = top; i >= 0; i--) {
System.out.printf("stack[%d]=%d\n",i,stack[i]);
}
}
至此,一个简单的栈结构就模拟完成了
那么栈可以用来做什么呢?
进制转换、判断括号是否匹配、算数表达式的计算、中缀表达式转换后缀表达式
本文来实现一个中缀表达式的计算、后缀表达式计算以及中缀表达式转换后缀表达式
栈实现综合计算器
首先分析,表达式由运算数和运算符组成,运算符具有优先级问题,所以在计算一个表达式时,是根据运算符优先级顺序对运算数进行对应运算符的计算
那么首先需要一些工具方法对用于遍历表达式时的判断,和运算表达式时的计算
包括:
1.判断字符是否是一个运算符
2.判断字符是否是括号
3.判断运算符的优先级
4.根据运算符计算两个数据
/**
* 判断char字符是否是一个运算符
* @param operator 要检测是否是运算符的char
* @return 是否为运算符
*/
static boolean isOperator(int operator){