栈(Stack):

 栈是一种特殊的线性表,栈中的数据元素以及数据元素之间的逻辑关系和线性表相同,两者之间的差别在于:线性表的插入和删除操作可以在表的任意位置进行,而栈的插入和删除操作只允许在表的尾端进行。其中,允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。通常,将元素插入栈的操作叫做入栈(push),而将元素从栈中进行删除并返回的操作叫做出栈(pop)。栈可以看成是一种受限的特殊的线性表,特殊性体现在它的插入和删除操作都是控制在线性表的一端进行的。其是一种后进先出(Last In First Out,LIFO)或者先进后出(First In Last Out,FILO)的线性表。

栈的API相关的接口(java):

public interface Stack<T>
{
public abstract void clear();//将一个已存在的栈置空
public abstract boolean isEmpty();//判断栈是否为空
public abstract int length();//返回栈中数据元素的个数
public abstract T peek();//读取栈顶元素并返回其值,但是不将栈顶的值从栈中进行删除,若栈为空,返回null
public abstract void push(T x)throws Exception;//将数据元素x压入栈顶
public abstract T pop();//删除并返回栈顶元素
}

 ps:对于栈,其是逻辑结构中线性结构的一种,其可以采用顺序存储结构和链式存储结构。采用顺序存储结构的栈称为顺序栈,采用链式存储结构的栈称为链栈。

 对于栈的实现,其可以通过改进的线性表对象直接进行实现,只要将相应的插入删除和返回值的操作约束在一端进行即可(对于链栈的实现,一般将其约束在头部进行入栈和出栈操作会节约栈的操作的时间复杂度),此处便不再对其进行实现。其中,通过此方式实现的顺序栈,所有的操作时间复杂度均为O(1),对于链栈其所有操作的时间复杂度也为O(1)(对于求取长度的操作,书上有些实现的时间复杂度是O(n),但是,实际上只要再加入一个变量对栈的长度在元素出入栈的时候进行统计,即可实现时间复杂度为O(1)的操作)

在java中,其栈可以直接采用Stack a=new Stack();(其中T为泛型变量)的方式进行对象的创建,其相应的类在java.util包中。

链栈和顺序栈的比较:

 对于链栈和顺序栈,其栈的所有操作时间复杂度均为O(1),其似乎并没有什么区别。但是,链栈有一个明显的优点,便是可以动态的对元素进行添加和删除,而不需要整体移动栈中的元素。而对于顺序栈,由于其数组的大小有一个容量的限制,为此,在超过数组长度的情况下,进行括容时,需要将其原先数组的全部元素完全的复制到增加了长度的数组中,从而时间上会比链栈的操作的长。对于链栈而言,其不如顺序栈的一点在于空间的浪费上要大于顺序栈,因为其除了要存储数据元素的值之外,还要存储下对应的指向下一个节点的指针。总体而言,个人感觉使用链栈会更加好一点。当然,顺序栈肯定也有其特点,不然其也不会存在(相信存在即合理),也可能只是个人没有想到而言,以后想到了再回更。

回到目录|·(工)·)

k:特殊的线性表—栈的更多相关文章

  1. [PHP] 数据结构-线性表的顺序存储结构PHP实现

    1.PHP中的数组实际上是有序映射,可以当成数组,列表,散列表,字典,集合,栈,队列,不是固定的长度2.数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了3.想要函数的一个参数 ...

  2. 第三章 线性表(C#实现)

    1.线性表 概念::零个或多个数据元素的有序序列. 描述: 2.线性表的抽象数据类型: ADT线性表 Data:线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. ...

  3. 线性表——顺序表的实现与讲解(C++描述)

    线性表 引言 新生安排体检,为了 便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这 ...

  4. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  5. 线性表 及Java实现 顺序表、链表、栈、队列

    数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...

  6. [置顶] ※数据结构※→☆线性表结构(stack)☆============栈 序列表结构(stack sequence)(六)

    栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表.栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据.栈 ...

  7. K:线性表的实现—链表

    单链表的概念:  采用链式存储方式存储的线性表称之为链表,链表中每个节点包含存放数据元素的值的数据域和存放指向逻辑上相邻节点的指针域.若一个节点中只包含一个指针域,则称此链表为单链表. 单链表的特点: ...

  8. Java 线性表、栈、队列和优先队列

    1.集合 2.迭代器 例子: 3.线性表 List接口继承自Collection接口,有两个具体的类ArrayList或者LinkedList来创建一个线性表 数组线性表ArrayList Linke ...

  9. Stack栈类与、Queue队列与线性表的区别和联系

    栈和队列都属于特殊的线性表   一.定义   1.线性表(linear list): 是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列.数据元素是一个抽象的符号,其具体含义在不同的情 ...

随机推荐

  1. OWASP JUICE SHOP部分题解

    本文作者:S0u1 0×00 简介 OWASP JUICE SHOP是一个开源的web应用靶场,里面包含了共记47个漏洞挑战任务,囊括了OWASP TOP 10的各个点,是一个很不错的渗透测试练手项目 ...

  2. [Objective-C语言教程]命令行参数(23)

    执行时,可以将一些值从命令行传递给Objective-C程序. 这些值称为命令行参数,很多时候它们对程序很重要,特别是当想要从外部控制程序而不是在代码中对这些值进行硬编码时就很有用了. 命令行参数使用 ...

  3. springBoot整合MyBatise及简单应用

    springBoot整合MyBatise及简单应用 我采用的是 工具IDEA 框架是springBoot+maven+Mybatise 第一步: pom.xml 引入相关jar包 <?xml v ...

  4. SaltStack Grains 详解

    简介 Grains 是SaltStack 的重要组件之一.主要记录minion的静态信息,比如CPU,内存,磁盘,网络信息等.Grains信息是minion启动时汇报给Master的. 刷新grain ...

  5. Ubuntu下增加eclipse菜单图标并配置java path(解决点击图标不能启动eclipse的问题)

    Ubuntu下增加eclipse菜单图标 Ubuntu的菜单图标在/usr/share/applications目录下. 1. 在/usr/share/applications目录下新建eclipse ...

  6. 配置bootstrap环境

    bootstrap是一个优雅,灵活,可扩展的前端工具集,可搭建WEB页面的HTML,CSS,JavaScript工具集,最重要的是它的栅格系统. 这里不做更多的详细介绍具体可参照官方网站:http:/ ...

  7. Java将\替换成/

    public static void main(String[] args) { String str="upload\\media\\201904\\i4Qjz8E40xGQovUq-2C ...

  8. docker阿里云镜像加速器使用

    加速器使用:加快镜像下载速度 访问www.aliyun.com: 登录之后点击”控制台“,选择“产品与服务“: 选择“容器镜像服务“: 设定密码后选择“镜像加速器”:  这里会有一个加速器地址:  在 ...

  9. Spring事务杂谈

    1. 什么是事务 事务就是以一种可控的方式,对资源进行的一组操作,保证了资源在事务前后,始终应处于被期待的正确的状态.比如不会受到宕机等原因的影响.事务本身,具有如下4种属性-ACID.(所以说事务是 ...

  10. anyncTask的3个参数(从源码可以发现其中使用了ThreadPoolExcuter线程池)

    AnyncTask异步处理数据并将数据应用到视图的操作场合 一  其中包含这几个方法 1 onPreExcute() 初始化控件,例如进度条2 doInBackground() 具体的执行动作请求数据 ...