赞
踩
栈是一种常用的数据结构,其数据存储使用的是逻辑结构。逻辑结构是一个比较抽象的概念,它依赖于物理结构而存在。逻辑结构又分为线性结构和非线性结构。比如顺序表表、栈和队列等就是典型的线性结构,而树和图等就是非线性结构。
栈(Stack)是一种线性数据结构,它就像一个单通道的容器,其中的元素只能先进后出(First In Last Out,简称 FILO)。由于其是单通道的,所以决定了最早进入容器的元素只能最晚出。最早进入的元素存放的位置叫做栈底,最后进入的元素存放的位置叫做栈顶。像栈这种线性结构既可以用数组来实现,也可以用链表来实现。
数组实现如下:
链表实现如下:
入栈操作(push)就是把新元素放入栈中,只允许从栈顶一侧放入元素,新元素的位置将会称为新的栈顶。
如图所示,已经栈中已有元素3、5、1、4、9、6,其中 3 为栈底元素,6 为栈顶元素,此时有元素 7 需要入栈,那么入栈之后的栈顶元素就变成了 7。
出栈操作(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。代码仅供参考,只是实现了出栈和入栈操作,其他向获取栈顶元素等操作并未实现。
入栈和出栈只涉及最后一个元素,不涉及其他元素的整体移动,所以无论是以链表的形式实现,还是以数组的形式实现,入栈、出栈的时间复杂度都是 。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。