k:特殊的线性表—栈
栈(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:特殊的线性表—栈的更多相关文章
- [PHP] 数据结构-线性表的顺序存储结构PHP实现
1.PHP中的数组实际上是有序映射,可以当成数组,列表,散列表,字典,集合,栈,队列,不是固定的长度2.数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了3.想要函数的一个参数 ...
- 第三章 线性表(C#实现)
1.线性表 概念::零个或多个数据元素的有序序列. 描述: 2.线性表的抽象数据类型: ADT线性表 Data:线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. ...
- 线性表——顺序表的实现与讲解(C++描述)
线性表 引言 新生安排体检,为了 便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这 ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- [置顶] ※数据结构※→☆线性表结构(stack)☆============栈 序列表结构(stack sequence)(六)
栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表.栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据.栈 ...
- K:线性表的实现—链表
单链表的概念: 采用链式存储方式存储的线性表称之为链表,链表中每个节点包含存放数据元素的值的数据域和存放指向逻辑上相邻节点的指针域.若一个节点中只包含一个指针域,则称此链表为单链表. 单链表的特点: ...
- Java 线性表、栈、队列和优先队列
1.集合 2.迭代器 例子: 3.线性表 List接口继承自Collection接口,有两个具体的类ArrayList或者LinkedList来创建一个线性表 数组线性表ArrayList Linke ...
- Stack栈类与、Queue队列与线性表的区别和联系
栈和队列都属于特殊的线性表 一.定义 1.线性表(linear list): 是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列.数据元素是一个抽象的符号,其具体含义在不同的情 ...
随机推荐
- Java 读写锁的实现
一. synchronized和ReentrantLock的对比 到现在,看到多线程中,锁定的方式有2种:synchronized和ReentrantLock.两种锁定方式各有优劣,下面简单对比 ...
- python --爬虫基础 --爬猫眼top 100 使用 requests 库的基本操作
import requests import re import json import time def get_page(url): # 获取页数 headers = { 'User-Agent' ...
- CSS04--对齐、 布局、导航栏
我们接着上一章,继续学习一些有关对齐.布局.导航栏的内容. 1.水平块对齐: 1.1 margin:把左和右外边距设置为 auto,规定的是均等地分配可用的外边距.结果就是居中的元素 .c ...
- 多线程atomicInteger
并发编程的3个重要概念 1.原子性: 一个操作或者多个操作,要么全部成功,要么全部失败 1.java中保证了基本数据类型的读取和赋值,保证了原子性,这些操作不可终端 a=10 原子性 b=a 不满足 ...
- [Alpha]Scrum Meeting#7
github 本次会议项目由PM召开,时间为4月9日晚上10点30分 时长15分钟 任务表格 人员 昨日工作 下一步工作 木鬼 整理并发布之前因为清明耽误的博客 撰写每日例会报告 SiMrua 添加暂 ...
- (四)Audio子系统之AudioRecord.read
在上一篇文章<(三)Audio子系统之AudioRecord.startRecording>中已经介绍了AudioRecord如何开始录制音频,接下来,继续分析AudioRecord方 ...
- 内核诊断(1)interrupt took too long
The linux kernel gathers samples using 'perf' performance monitor without affecting the latencies. T ...
- 【实战】Weblogic反序列化Getshell
修仙就是干,直接操作起来 1.访问http://x.x.x.x:7001/wls-wsat/CoordinatorPortType 2.加入Content-Type:text/xml 3.在body中 ...
- 【Kafka】Kafka数据可靠性深度解读
转帖:http://www.infoq.com/cn/articles/depth-interpretation-of-kafka-data-reliability Kafka起初是由LinkedIn ...
- 四大组件之Service
1 通过startService 1.1 与调用者相对独立,没有返回,用于播放音乐,下载文件 1.2 如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行.下次 ...