首页 > 编程语言 >数据结构与算法-栈

数据结构与算法-栈

时间:2023-11-07 12:12:34浏览次数:42  
标签:count return String 链表 算法 数组 数据结构 public

什么是栈

 

栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。

相比数组和链表,栈带给我的只有限制,并没有任何优势。那我直接使用数组或者链表不就好了吗?为什么还要用这个“操作受限”的“栈”呢?

从功能上来说,数组或链表确实可以替代栈,但你要知道,特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。

当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,这时我们就应该首选“栈”这种数据结构。

栈的几种实现方式

顺序栈

基于数组实现

代码例子

 1 // 基于数组实现的顺序栈
 2 public class ArrayStack {
 3   private String[] items;  // 数组
 4   private int count;       // 栈中元素个数
 5   private int n;           //栈的大小
 6 
 7   // 初始化数组,申请一个大小为n的数组空间
 8   public ArrayStack(int n) {
 9     this.items = new String[n];
10     this.n = n;
11     this.count = 0;
12   }
13 
14   // 入栈操作
15   public boolean push(String item) {
16     // 数组空间不够了,直接返回false,入栈失败。
17     if (count == n) return false;
18     // 将item放到下标为count的位置,并且count加一
19     items[count] = item;
20     ++count;
21     return true;
22   }
23   
24   // 出栈操作
25   public String pop() {
26     // 栈为空,则直接返回null
27     if (count == 0) return null;
28     // 返回下标为count-1的数组元素,并且栈中元素个数count减一
29     String tmp = items[count-1];
30     --count;
31     return tmp;
32   }
33 }
View Code

在入栈和出栈过程中,只需要一两个临时变量存储空间,所以空间复杂度是 O(1)。

这里存储数据需要一个大小为 n 的数组,并不是说空间复杂度就是 O(n)。因为,这 n 个空间是必须的,无法省掉。所以我们说空间复杂度的时候,是指除了原本的数据存储空间外,算法运行还需要额外的存储空间。

链式栈

基于链表实现

支持动态扩容的栈

链式栈天然支持扩容,顺序栈需要动态扩容数组

链式栈缺点就是使用的是链表。需要存储后驱节点指针

顺序栈是基于数组,扩容阶段的时候会拷贝一份到新数组,造成扩容的时候内存占用双份。同事还会预留一些闲置空间

关于栈的应用场景

函数调用栈

栈在表达式求值中的应用

标签:count,return,String,链表,算法,数组,数据结构,public
From: https://www.cnblogs.com/LQBlog/p/17814712.html

相关文章

  • 《数据结构》概念复习一
    1.考前必背的知识点(干货)数据(Data):数据是描述客观事物的数值,字符以及能输入到计算机中且能被处理的各种符号集合。数据元素(DataElement):数据元素是组成数据的基本单位,是数据集合的个体,在数据结构中作为一个整体进行考虑和处理,一个数据元素由多个数据项构成数据对象(DataObject):......
  • 快速排序——acwing算法基础课笔记
    课堂内容+个人思考,个人笔记,但是欢迎补充、批评、指正。快速排序基于分治的思想平均时间复杂度O(nlogn)已知数组q[] 步骤:1、确定分界点(x): (1)首元素q[l];(2)尾元素q[r];(3)中值q[(l+r)/2];(4)随机;2、调整区间将区间通过x值划分为两部分(长度不一定相等),使得第......
  • 11.7算法
    题目相交链表给你两个单链表的头节点 headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点c1开始相交:题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。自定义评测:......
  • 排序算法
    1.插入类排序1.1直接插入排序classSolution{publicvoidinsertSort(int[]arr,intn){inttmp;for(inti=1;i<n;i++){//将待插入的关键字暂存于tmp中tmp=arr[i];intj=i-1;/......
  • 商品sku算法
    笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesianproduct),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员实现简单的sku算法`constspec=[['红','白','蓝'],['32G','64G'],['移动','联通','电信']]......
  • 数据结构-队列和栈
    栈和队列是两种不同的数据形式,区别就是栈是先进后出,但是队列先进先出,可以用数据结构模拟这两种形式。1、队列完整代码如下:#include<stdio.h>#include<stdlib.h>#if0/*顺序队列*/intenQueue(int*a,intrear,intdata){a[rear]=data;rear++;retur......
  • 数据结构-链表2
    1、静态链表这个给我的感觉就是数组加了索引,它的目的就是要融合顺序表和链表的优点,能够快速的访问元素,也能快速的增加或删除元素。整个的组成如图所示,第一列的数据是位置,第二列是数据2、双向链表双向链表概念是区别于单链表而言的,就是多了一个前驱,组成示意图如下所示:常见结......
  • 数据结构-队列
    一、概念1、队列的定义队列是仅限在一端进行插入,另一端进行删除的线性表。队列又被称为先进先出(FirstInFirstOut)的线性表,简称FIFO。2、队首允许进行元素删除的一端称为队首3、队尾允许进行元素插入的一端称为队尾二、接口1、可写接口(1)数据入队队列的插入操作,叫做入队。它是......
  • 数据结构
    数据的逻辑结构:线性逻辑结构:一对一除第一个和最后一个元素外,数据的每一个元素都有且只有一个直接前驱和一个直接后继树型逻辑结构:一对多有且只有一个称为根的数据元素;根没有前驱,其余的每个元素有且只有一个前驱,末端元素没有......
  • 算法刷题记录-螺旋矩阵
    算法刷题记录-螺旋矩阵螺旋矩阵给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的nxn正方形矩阵matrix。示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]]示例2:输入:n=1输出:[[1]]思路,这题有点绕,我用了一个比res大2的布尔矩阵来存储......