什么是栈
栈是一种常用的数据结构,其数据存储使用的是逻辑结构。逻辑结构是一个比较抽象的概念,它依赖于物理结构而存在。逻辑结构又分为线性结构和非线性结构。比如顺序表表、栈和队列等就是典型的线性结构,而树和图等就是非线性结构。
栈(Stack)是一种线性数据结构,它就像一个单通道的容器,其中的元素只能先进后出(First In Last Out,简称 FILO)。由于其是单通道的,所以决定了最早进入容器的元素只能最晚出。最早进入的元素存放的位置叫做栈底,最后进入的元素存放的位置叫做栈顶。像栈这种线性结构既可以用数组来实现,也可以用链表来实现。
数组实现如下:
链表实现如下:
栈的基本操作
1.入栈
入栈操作(push)就是把新元素放入栈中,只允许从栈顶一侧放入元素,新元素的位置将会称为新的栈顶。
如图所示,已经栈中已有元素3、5、1、4、9、6,其中 3 为栈底元素,6 为栈顶元素,此时有元素 7 需要入栈,那么入栈之后的栈顶元素就变成了 7。
2.出栈
出栈操作(pop),也叫弹栈操作,就是把元素从栈中弹出,只有栈顶元素才允许出栈,出栈之后,出栈元素的前一个元素将会成为新的栈顶元素。
如图所示,已知栈中已有元素3、5、1、4、9、6、7,其中 7 为栈顶元素,现在元素 7 想要出栈,那么出栈之后新的栈顶元素就是 6,栈底元素不变。
代码展示
栈的入栈和出栈相关代码代码如下:
package structure.stack;
/**
* @ClassName: Stack
* @Author: jiaomubai
* @Date: 2022/1/30 14:55
* @Description: 栈的出栈与入栈操作
*/
public class Stack {
// 存储数据的数组
private int[] dataArray;
// 栈顶元素下标
private int top;
// 栈底元素下标
private int bottom;
public Stack(int capacity) {
this.dataArray = new int[capacity];
}
/**
* 入栈
* @param element
*/
public void push(Integer element) {
System.out.println("入栈元素为:" + element);
if (top == dataArray.length) {
System.out.println("栈已满");
return;
}
dataArray[top] = element;
System.out.println("入栈之后栈顶元素为:" + dataArray[top]);
System.out.println("入栈之后栈底元素为:" + dataArray[bottom]);
top++;
System.out.println();
}
/**
* 出栈
* @return
*/
public Integer pop() {
if (top == bottom) {
System.out.println("栈已空");
return -1;
}
Integer popElement = dataArray[--top];
System.out.println("出栈元素为:" + popElement);
if (top == -1) {
System.out.println("出栈之后栈顶元素为:" + null);
System.out.println("出栈之后栈底元素为:" + null);
} else {
System.out.println("出栈之后栈顶元素为:" + dataArray[top]);
System.out.println("出栈之后栈底元素为:" + dataArray[bottom]);
}
System.out.println();
return popElement;
}
/**
* 打印
*/
public void print() {
for (int i = 0; i < top - 1; i++) {
System.out.print(dataArray[i] + " --> ");
}
if (top == 0) {
System.out.println("空栈");
} else {
System.out.println(dataArray[top - 1]);
}
}
public static void main(String[] args) {
Stack stack = new Stack(6);
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
stack.push(6);
stack.push(7);
System.out.println();
stack.print();
System.out.println();
stack.pop();
stack.pop();
stack.pop();
stack.print();
}
}
以上代码是使用数组模拟的一个栈,实际使用时 Java 可直接调用 Stack 相关的 API 即可。如上代码所示,初始化栈时,栈中每个元素都是 0。每有一个元素入栈时,top 自增 1,每有一个元素出栈时,top 自减 1。代码仅供参考,只是实现了出栈和入栈操作,其他向获取栈顶元素等操作并未实现。
入栈和出栈只涉及最后一个元素,不涉及其他元素的整体移动,所以无论是以链表的形式实现,还是以数组的形式实现,入栈、出栈的时间复杂度都是 。