前言
栈是一种线性结构,它的特点是先进后出,就例如一个书箱中装满了书,我们能够最先取到的肯定是最后放的那一本书,因为它在最上面,而我们最先放入书箱的那一本书,由于被压到了最下面,因此只能最后被取出来。
栈结构的实现可以使用数组或链表。使用数组实现的栈称为顺序栈,它需要预先指定栈的最大容量。使用链表实现的栈称为链式栈,它可以根据需要动态分配内存。
栈结构在计算机科学中有广泛的应用。例如,编程语言中的函数调用栈用于保存函数调用的上下文信息。在算法中,栈可以用于解决递归问题、实现深度优先搜索等。栈还可以用于处理表达式求值、括号匹配、浏览器的前进后退功能等。
需要注意的是,栈结构具有一定的局限性。由于栈的特性,只能在栈顶进行操作,因此在某些场景下,可能需要使用其他数据结构来完成更复杂的操作。
这里主要介绍的是用数组来实现栈
名词解释
入栈:将一个元素放入栈的顶部
出栈:从栈的顶部移除一个元素
栈顶:栈最后放入的元素所在的位置
栈底:栈最先放入的元素所在的位置
代码实现
在实现栈结构的时候,由于使用的数组来当作栈的容器,因此可以预先定义好数组的大小,之后需要设置一个指针top,指向栈顶,当没有数据的时候,这个指针top为-1,需要添加几个方法,包括:入栈、出栈、判断栈是否已满、判断栈是否为空、返回栈中的数据总数、遍历栈中的数据
1.初始化栈
package exer.stack;
public class ArrayStack {
//栈的大小
private int stackSize;
//创建一个容器当作栈
private int[] stack;
//栈顶指针
private int top=-1;
public ArrayStack(int stackSize) {
this.stackSize=stackSize;
stack=new int[stackSize];
}
/**
* 判断栈是否满了
*/
public boolean isFull(){
if (top==stackSize-1){
return true;
}
return false;
}
/**
* 判断栈是否为空
*/
public boolean isEmpty(){
if (top==-1){
return true;
}
return false;
}
/**
* 数据入栈
*/
public void push(int data){
if (!isFull()){
//要先将指针向前移,不然的会覆盖之前的数据
top++;
stack[top]=data;
}else{
throw new RuntimeException("栈已满");
}
}
/**
* 数据弹栈
*/
public int pop(){
if (!isEmpty()){
int value=stack[top];
//将指针向后移一位
top--;
return value;
}
throw new RuntimeException("栈为空");
}
/**
* 返回栈的数据总数
*/
public int length(){
return top+1;
}
/**
* 遍历栈的数据
*/
public void list(){
if (isEmpty()){
throw new RuntimeException("栈为空");
}
for (int i = 0; i < top+1; i++) {
System.out.printf("stack[%d]=%d\n",i,stack[i]);
}
}
}
2.利用测试回文数据来验证栈的正确性
/**
* 测试回文数据验证栈的正确性
*
* @author lyj
* @date 2023-07-24
*/
@Test
public void test() {
String str = "aba";
System.out.println(testStack(str));
}
public static boolean testStack(String str) {
ArrayStack arrayStack = new ArrayStack(10);
for (int i = 0; i < str.length(); i++) {
arrayStack.push(str.charAt(i));
}
int length = arrayStack.length();
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < length; i++) {
stringBuffer.append((char) arrayStack.pop());
}
System.out.println(stringBuffer.toString());
if (str.equals(stringBuffer.toString())) {
return true;
} else {
return false;
}
}