数据结构 - 栈

205 阅读3分钟

前言

本章用于主要讲述 栈 中 顺序栈 的介绍与使用,阅读时长约 5min

介绍:

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算

规格:

栈允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP);按照后进先出(LIFO, Last In First Out) 的原理运作,称为后进先出表。

特点:
  1. 空间是静态分配的
  2. 栈比链栈查询速度更快
  3. 先进后出,栈底是固定的,最先入栈的只能在栈底
  4. 限制了只能在栈顶(尾部)进行数据的插入与删除
复杂度分析

栈属于常见的一种线性结构,对于进栈和退栈而言,时间复杂度都为 O(1)

前奏准备

本文章讲解所用的编程语言为 Java

基本方法

顺序栈与顺序表一致都是用数组来实现的,首先需要先定义一个为 stack 用于存储数据的数组;还有由于入栈和出栈只能在栈顶操作,因此还需定义一个 top 用于指向栈顶元素的位置

所需的方法不多,主要的为 入栈出栈

 public class Stack {
     Object[] stackElem; // 对象数组
     int top; // 栈顶: 非空时始终指向栈顶元素的下一个存储位置
 ​
     public Stack(int maxSize) {
         top = 0; // 默认值; 当栈为空,top值为0
         stackElem = new Object[maxSize]; // 存储空间容量
     }
 ​
     // 取出栈顶元素
     public int peek() {}
 ​
     // 栈是否为空
     public boolean isEmpty() {}
 ​
     // 添加入栈
     public void push(Object e) {}
 ​
     // 删除出栈
     public Object pop(Object e) {}
 ​
     // 栈中元素的个数
     public int length() {}
 ​
     // 清空栈
     public void clear() {}
 ​
     // 输出从栈顶到栈顶的所有元素
     public void display() {}
 }

前奏准备完毕后,我们就可以开始重写方法了 (●'◡'●)

length(个数)与 clear(清空)

先来两个简单的;length 用于返回栈中元素的个数,clear 用于清空栈

代码示例
     // 栈中元素的个数
     public int length() {
         return top;
     }
 ​
     // 清空栈
     public void clear() {
         top = 0;
     }

isEmpty(判空)

这个很多小伙伴应该都大致清楚是怎么实现的;如果有元素 top 就不为空 ,所以直接判断即可。

代码示例
     // 栈是否为空
     public boolean isEmpty() {
         return top == 0;
     }

push(入栈)

入栈操作是将指定数据元素插入顺序栈中,使其成为新的栈顶元素,类型为 Object

入栈方法的思路:
  1. 判断是否栈满
  2. 将新的数据存入top所指向的存储单元,使其成为新的栈顶;
  3. 栈顶指针 top+1
代码示例
     // 添加入栈
     public void push(Object e) {
         if (top == stackElem.length) {
             throw new RuntimeException("栈堆已满");
         } else {
             stackElem[top++] = e;
         }
     }
图文解析

pop(出栈)

入栈操作是将栈顶元素从栈中移去,并返回被移去的栈的元素的值

出栈方法的思路:
  1. 判断栈是否为空
  2. 先将 top -1 再使栈顶指针指向栈顶元素,并返回栈顶元素
代码示例
     // 删除出栈
     public Object pop(Object e) {
         if (isEmpty()) {
             return null;
         }
         return stackElem[--top];
     }

peek(取出)

peek 用于取出栈顶元素

取出方法的思路:
  1. 判断栈是否为空
  2. 若不为空,返回当前栈顶元素(索引为 top -1
代码示例
     public Object peek() {
         if(isEmpty()){
             return null;
         }else{
             return stackElem[top-1];
         }
     }

display(输出)

display 用于从栈顶开始循环向下,输出从栈顶到栈顶的所有元素

代码示例
     public void display() {
         for (int i = top - 1; i >= 0; i--) {
             System.out.println(i + " - " + stackElem[i].toString());
         }
     }

打印示例

最后我们将所有方法测试一下~

image-20220426174739610

以上就是顺序栈的介绍与方法实现了 o( ̄▽ ̄)d