栈的特点
栈(Stack)又称堆栈,是一种基于后进先出(LOFO)策略的集合类型。是限制在表的一端进行插入删除运算的线性表。栈可以用来在函数调用时存储断点,做递归时要用到栈。
通常将能够进行插入和删除运算的这一端称为栈顶,另一端称为栈底。当表中没有元素时称为空栈。
栈的常用运算:
Pop():弹出操作,每次删除操作。
Push():压入操作,将数据插进栈中。
isFull():判断当前栈是否是空栈。
isEmpty():判断当前栈是否已满。
Pick():得到栈顶元素的值,但不能出栈。
Size():得到当前栈中的元素个数。
栈的实现
我们通过数组来实现一个简单的栈。在顺序存储下,需要考虑堆栈的上溢。这是一种出错的状态,应该避免它。
栈的初始化:初始化一个大小为maxSize的数组,因为在栈中我们只在一端进行运算,所以我们只定义一个栈 顶。并将它初始化为-1;
入栈:先将栈顶+1,然后将数据压入栈中。
出栈:先定义一个中间变量,将栈顶指向的数据传入这个中间变量中,然后栈顶-1;
判空:当栈顶指向-1时,是空栈
判满:当栈顶指针指向maxSize-1时,栈满
得到栈顶元素:直接返回栈顶指向的数据
得到栈中元素的个数:栈顶指针减去-1;
显示栈中的数据:栈是一个数组,直接访问数组下标0到栈顶的元素
代码实现:
class ArrayStackString {
//存储数组
private String[] arr;
//数组最大的容量
private int maxSize;
//表示栈顶指针
private int pop;
//初始化栈
public ArrayStackString(int num){
maxSize = num;
pop = -1;
arr = new String[maxSize];
}
//判满
public boolean isFull(){
return pop == maxSize - 1;
}
//判空
public boolean isEmpty(){
return pop == -1;
}
//入栈操作
public void push(String n){
if(isFull()){ //先要判满,避免堆栈上溢
throw new IllegalStateException("栈已满,无法存入数据");
}
arr[++pop] = n;
}
//出栈操纵
public String pop(){
if(isEmpty()){ //判空,避免堆栈下溢
throw new IllegalStateException("栈空,无法取出数据");
}
String result = arr[pop--];
return result;
}
//栈中数据个数
public int Size(){
return pop - (-1);
}
//得到栈顶元素
public String pick(){
return arr[pop];
}
//打印栈
public void ShowStack(){
if(isEmpty()){
System.out.println("栈空");
}
for (int i = 0; i <= pop ; i++) {
System.out.print(arr[i] + "\t");
}
System.out.println();
}
}
测试:
public static void main(String[] args) {
ArrayStackString arrayStackString = new ArrayStackString(10);
arrayStackString.push("a");
arrayStackString.push("b");
arrayStackString.push("c");
arrayStackString.push("d");
arrayStackString.ShowStack(); // a b c d
arrayStackString.pop();
System.out.println(arrayStackString.Size()); //3
System.out.println(arrayStackString.pick()); //c
arrayStackString.ShowStack(); //a b c
}