数据结构-栈(代码片段)

1101- 1101-     2022-12-03     209

关键词:

栈与队列

技术图片

概念

栈:是限定仅在表尾进行插入和删除操作的线性表

栈顶(top):允许插入和删除的一端,即表尾称为栈顶

栈底(bottom):表头称为栈底

栈是LIFO结构,后进先出。

与线性表相比,特殊之处在于

限制了线性表的插入和删除位置,始终在栈顶进行。

所以栈底是固定的,最先进栈的只能在栈底

相关操作

栈的插入操作 —> 进栈(圧栈、入栈)

栈的删除操作 —> 出栈(弹栈)

假设入栈元素从小到大,出栈的每个元素后面比该元素小的元素,应该按从大到小的相对顺序排列

比如数字元素1、2、3依次进栈,

出栈顺序可能是 1、2、3 / 1、3、2 / 2、1、3 / 2、3、1 / 3、2、1

不可能是 3、1、2 的出栈顺序。

抽象数据类型

技术图片

栈的顺序存储结构

用数组实现

ArrayStack.java

package com.stack;

/**
 * 用数组实现的顺序表
 * 限制操作端,使其成为栈
 */
public class ArrayStack 

    private int maxSize;
    private int[] stack;
    private int top = -1;

    public ArrayStackDemo(int maxSize) 
        this.maxSize = maxSize;
        stack = new int[maxSize];
    

    public boolean isFull() 
        return top == maxSize - 1;
    

    public boolean isEmpty() 
        return top == -1;
    


    public void push(int value) 
        // 入栈
        if (isFull()) 
            System.out.println("栈满了");
            return;
        

        stack[++top] = value;
    

    public int pop() 
        // 出栈
        if (isEmpty()) 
            throw new RuntimeException("栈空");
        
        return stack[top--];
    

    public void list() 
        if (isEmpty()) 
            System.out.println("没有数据");
            return;
        
        for (int i = top; i >= 0; i--) 
            System.out.printf("stack[%d]=%d
",i,stack[i]);
        
    

栈的链式存储结构

简称链栈

LinkStack.java

package com.stack;

/**
 * 因为头结点是必须的,栈顶指针也是必须的。
 * 所以合二为一!即初始化的时候不需要头结点
 */
public class LinkStack 
    private Node top;

    public boolean isFull() 
        return false;
    

    public boolean isEmpty() 
        return top == null;
    


    public void push(int num) 
        // 很少满栈,直接创建结点头插
        Node node = new Node(num);
        node.next = top;
        top = node;
    

    public int pop() 
        // 出栈
        if (isEmpty()) 
            throw new RuntimeException("栈空");
        
        int value = top.data;
        top = top.next;
        return value;
    

    public void list() 
        if (isEmpty()) 
            System.out.println("没有数据");
            return;
        
        Node temp = top;
        while (temp != null) 
            System.out.print(temp.data+"	");
            temp = temp.next;
        
    



class Node
    public int data;
    public Node next;

    public Node() 
    

    Node(int data) 
        this.data = data;
    

Java中自带封装好的Stack类,可以直接使用。

技术图片

底层继承关系 class Stack<E> extends Vector<E>

用数组存储,如果栈满会自动扩容。

对比

顺序栈与链栈,它们在时间复杂度上是一样的,均为0(1)。

对于空间性能,顺序栈需要事先确定一个固定的长度,可能会存在内存空间浪费的问题,

但它的优势是存取时定位很方便,

而链栈则要求每个元素都有指针域,这同时也增加了一些内存开销,但对于栈的长度无限制。

所以它们的区别和线性表中讨论的一样,如果栈的使用过程中元素变化不可预料,有时很小,

有时非常大,那么最好是用链栈,反之,如果它的变化在可控范围内,建议使用顺序栈会更好一些。

栈的作用

  • 递归
  • 逆波兰式
  • 中缀转后缀

[数据结构]手动实现栈(代码片段)

栈有两种实现:静态栈(数组)和动态栈(链表)。这里采用链表。packagecom.darrenchan;publicclassMyStackpublicListNodestackTop;publicListNodestackBottom;publicMyStack(ListNodestackTop,ListNodestackBottom)this.stackTop=stackTop;this. 查看详情

数据结构--栈(stack)(代码片段)

...的定义定义:栈:一种先进后出,后进先出的数据结构(如箱子存放东西)栈和队列都是受到限制的顺序表栈分为顺序栈和链式栈栈只能在一端进行插入和删除,插入和删除的这一端称为栈顶,另一端... 查看详情

数据结构-栈(代码片段)

栈与队列栈概念栈:是限定仅在表尾进行插入和删除操作的线性表。栈顶(top):允许插入和删除的一端,即表尾称为栈顶栈底(bottom):表头称为栈底栈是LIFO结构,后进先出。与线性表相比,特殊之处在于限制了线性表的插入和删除... 查看详情

java数据结构—栈(代码片段)

Java数据结构—栈定义栈的应用场景数组模拟栈代码实现课后练习栈实现综合计算器定义栈的英文为(stack)栈是一个先入后出(FILO-FirstInLastOut)的有序列表栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特... 查看详情

[数据结构]单调栈(代码片段)

[数据结构]单调栈单调栈为栈中元素按照升序排列(递增栈)或降序排列(递减栈)的栈,通常可以用来寻找下一个最大/最小的题。以[1,3,4,2]数组实现一个递增栈:到[1,3,4]这里其实都没有什么问题,一直是处在递增的状态... 查看详情

[数据结构]单调栈(代码片段)

[数据结构]单调栈单调栈为栈中元素按照升序排列(递增栈)或降序排列(递减栈)的栈,通常可以用来寻找下一个最大/最小的题。以[1,3,4,2]数组实现一个递增栈:到[1,3,4]这里其实都没有什么问题,一直是处在递增的状态... 查看详情

数据结构栈(代码片段)

...用栈在内存的存储中了解到压栈和出栈,这种类似的数据结构中也有栈是限定仅在表尾进行插入或者删除操作的线性表。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原则图片即可解释࿰ 查看详情

sh壳牌栈数据结构封装(代码片段)

查看详情

数据结构之栈(代码片段)

文章目录栈的概念栈的功能实现栈结构的实现栈的初始化栈的判空读取栈顶数据插入数据删除数据栈中数据个数栈的销毁总结Stack.h文件Stack.c文件栈的概念栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操... 查看详情

数据结构--栈(代码片段)

一、什么是栈(Stack)  首先来说,栈是一种线性表的表现形式,其定义是只允许在栈顶进行插入或者删除的线性表,所以栈就有线性表的表现形式,链式栈和顺序栈。      栈顶(Top):允许进行数据的插入... 查看详情

杠上数据结构-栈(代码片段)

介绍栈:是一种只允许在一端进行插入,删除的线性表,具有先进后出的特性。通常,栈的操作端称为栈顶,另一端称为栈底。栈的插入称为进栈(push),栈的删除操作称为出栈(pop)。栈的存储结构既然栈的本质... 查看详情

数据结构-栈(代码片段)

栈是一种基本的数据结构基本概念栈(Stack):具有一定操作约束的线性表。只在一端(栈顶,Top)做插入、删除操作插入数据:入栈(Push)删除数据:出栈(Pop)后入先出:LastInFirstOut(LIFO)抽象数据类型描述类型名称:栈数据对象集:一... 查看详情

数据结构-栈(代码片段)

目录前言一、栈的概念与结构二、C语言-栈的基本操作与实现1.栈的创建2.栈的初始化3.入栈4.出栈5.获取栈顶元素6.获取栈中有效元素个数7.检测栈是否为空8.销毁栈三、栈的经典使用1.问题叙述2.解题方法3.代码实现前言本文均基于... 查看详情

数据结构复习第三章栈(代码片段)

(1)掌握栈的相关概念、特点和基本操作(入栈、出栈、判栈空、获取栈元素等)。栈:限制只能在表的一端进行插入和删除的线性表。允许插入和删除的一端,称为栈顶(top)。不允许插入和删除的另一端,称为栈底(bottom)。把一... 查看详情

我理解的数据结构——栈(stack)(代码片段)

我理解的数据结构(二)——栈(Stack)一、栈基础栈是一种线性结构相比较数组,栈对应的操作是数组的子集只能从一端添加元素,也只能从同一端取出元素,这一端称为栈顶栈是一种后进先出的数据结构,LIFO(LastInFirstOut)... 查看详情

3线性结构栈队列(代码片段)

一、栈的介绍栈(stack),是一种线性存储结构,它有以下几个特点:  (1)栈中数据是按照"后进先出(LIFO,LastInFirstOut)"方式进出栈的。  (2)向栈中添加/删除数据时,只能从栈顶进行操作。栈通常包括的三种操作:push、peek... 查看详情

数据结构和算法-栈(代码片段)

栈可以分为顺序栈:数组实现链式栈:链表实现空间复杂度栈的空间复杂度:有一个n个元素的栈,在入栈和出栈过程中,只需要存储一个临时变量存储空间,所以空间复杂度是O(1)并不是说栈有n个元素,空间复杂度就是O(n),而是指除了原本... 查看详情

数据结构---[栈(stack)](代码片段)

...定义栈的基本操作实现栈(stack)栈也是一种线性数据结构,只能从栈顶一段添加/取出元素;类似于单口试管;后进先出LastInFirstOut(LIFO)栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删... 查看详情