黑马程序员——关于数据结构栈的实现方式的探讨

黑马程序员考试题 题目一 文本文件中存储了多个文章标题、作者,标题和作者之间用若干空格(数量不定)隔开,每行一个,标题有的长有的短,输出到控制台的时候最多标题长度10,如果超过10,则截取长度8的子串并且最后添加“...”,加一个竖线后输出作者的名字。 namespace test1 { class Program { /*文本文件中存储了多个文章标题、作者,标题和作者之间 阅读详情
------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

数据结构栈

        栈是限制插入和删除只能在一个位置上进行的表。该位置是表的末端,叫做栈顶(top)。对栈的基本操作有进栈(push)和出栈(pop),前者相当于插入,后者相当于删除最后插入的元素。

       栈有时又叫做LIFO(后进先出)表。最基本的操作是进栈和出栈,还有一些其他操作,例如清空栈、判断栈是否为空、返回栈中元素的位置等,都作为栈的操作指令系统的一部分。

栈的实现

由于栈是一个表,因此任何实现表的方法都能实现栈。所以,ArrayList和LinkedList都可以实现栈,而大部分实现栈的方式也都是通过这两种方式进行的。

下面,我们先来用ArrayList来实现,代码如下:

import java.util.*;
class ArrayStack<T>{
	private ArrayList<T> list;
	ArrayStack(){
		list = new ArrayList<T>();
	}
	//入栈操作,并返回入栈元素
	public T push(T item){
		list.add(item);
		return item;
	}
	//出栈操作,并返回出栈元素
	public T pop(){
		return list.remove(list.size()-1);
	}
	//查看栈顶部的元素,但不移除该元素
	public T peek(){
		return list.get(list.size()-1);
	}
	//测试栈是否为空
	public boolean isEmpty(){
		return list.isEmpty();
	}
	//返回元素在栈中的位置,以0为基数
	public int search(Object o){
		return list.indexOf(o);
	}
}

在该实现类中,我们在构造器中创建了ArrayList的对象,并定义了栈的一些基本操作,其底层都是通过ArrayList来实现的。并加入泛型来使栈的使用者可以自定义栈中元素的类型。我们再用LinkedList来实现栈,先看代码:

import java.util.*;
class LinkedStack<T>{
	private LinkedList<T> list;
	LinkedStack(){
		list = new LinkedList<T>();
	}
	//入栈操作,并返回入栈元素
	public T push(T item){
		list.addFirst(item);
	    return item;
	}

	//出栈操作,并返回出栈元素
	public T pop(){
		return list.removeFirst();
	}

	//查看栈顶部的元素,但不移除该元素
	public T peek(){
		return list.peekFirst();
	}

	//测试栈是否为空
	public boolean isEmpty(){
		return list.isEmpty();
	}

	//返回元素在栈中的位置,以0为基数
	public int search(Object o){
		return list.indexOf(o);
	}
}

我们可以看到,LinkedList栈的实现方式与ArrayList的实现方式大致相同,只是底层调用的是LinkedList的特有方法。

细心的朋友可能会发现,在LinkedList的API中,提供了push()和pop()方法,说明在LinkedList类中,已经为我们提供了栈的实现,就不用我们自己去定义了,那他是怎么实现的呢?我们可以看一下LinkedList的源码。LinkedList中push()和pop()的源码如下:

public void push(E e) {
        addFirst(e);
    }

public E pop() {
        return removeFirst();
    }

可以看到,源码中入栈与出栈的实现方式底层也是调用的LinkedList的方法,跟我们自定义的方式是一样的,只不过他的返回值是void而已。

其实,LinkedList中的push()和pop()方法是实现自Deque()接口,该接口是Queue的子接口,JDK1.6出现。定义了队列和栈的实现方法。

Java1.0中的栈

早在Java1.0版本,就有栈的实现方式。即Stack类,该类实现了栈的基本操作方法,但是该类并不是通过类Vector来构建,而是直接继承了Vector,具有Vector的所有特点和行为,再加上一些Stack的特有行为。所以这算是一个比较糟糕的设计,我们只做了解,不用作使用。


数据结构与算法--黑马课堂 改进 把代码简化。 阅读详情

相关推荐

用java实现的栈,通过使用ArrayList的方法

此方法是通过java提供的ArrayList方法对栈的实现;

数据结构——栈的实现

Stack.c Test.c

qq_59702185的博客 335

数据结构之栈的实现.rar

数据结构之栈的实现,借鉴数据结构严蔚敏版,略有修改。基于VS2010实现,可直接运行

黑马程序员-----java基础之数组及堆和栈

数组 一、数组的概述 引述:当我们需要定义多个同一的数据类型来进行以后的运算的时候(例如,我们要需求是统计某公司的员工的工资),这是我们会定义很多的变量,但是这样极大的不便,所以java提供了数组给我们。 概述:数组是储存同一数据类型多个元素的集合,也可以将其看做是一个容器。数组可以存储基本数据类型,也可以存储引用数据类型。 定义数组的格式: 格式1:数据类型[]   数组名;

gfl2010xx的博客 609

数据结构之栈的定义及实现

数据结构之栈的定义及实现。

C语言 数据结构中栈的实现代码

主要介绍了C语言 数据结构中栈的实现代码的相关资料,需要的朋友可以参考下

【数据结构】栈(实现+原码)

栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出LIFO(Last In First Out)原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶。 栈的实现 栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。 #pragma once #include<s.

Edward_Asia的博客 1713

UUVsimulator仿真

pub -r 10 /cmd_vel geometry_msgs/Twist控制运动没有反应。通过键盘控制运动,接收不到/cmd_vel消息。

Fatal__的博客 4606

【数据结构】栈(Stack)的实现

/定义一个数组//当前栈中有效元素的个数//无参构造方法:默认栈的大小this(10);//注意:这里的this就是下面的MyStack//有参构造方法。

qq_48479056的博客 1170

GPMC开发笔记(TI开发者推荐笔记)

因为gpmc(General-Purpose Memory Controller)是TI特有的驱动,gpmc的资料比较少,本人开发gpmc驱动算是摸了很多石头过河的。所以想通过这遍文章可以给也做GPMC驱动开发的后来者有一点参考价值。文章如有瑕疵也请各位批评改正。 1.GPMC介绍 gpmc主要用于与nandflash,norflash,fpga进行通信。在这里主要介绍gpmc16位数据和地址线不复用nor模式下的通信。 注意:在这种模式下gpmc_a[0]引脚是没法使用的 1.1GPMC信号线

weixin_44316996的博客 7498

Ansys Zemax | 多模光纤耦合效率优化与IMAE操作数实战解析

本文详细解析了在Ansys Zemax(OpticStudio)中优化多模光纤耦合效率的实战流程。通过几何图像分析诊断初始效率,并重点介绍了如何利用IMAE操作数将分析工具转化为自动化优化引擎,实现从2%到54%的几何效率飞跃。文章还探讨了引入菲涅尔损耗与偏振计算以逼近真实效率,并分享了关键的避坑指南与高阶技巧。

xk7n92h3p5m的博客 749

【数据结构】栈的代码实现

🌟个人博客:www.hellocode.top🌟 ⭐所有文章均在上方博客首发,其他平台同步更新 🔥本文专栏:《数据结构与算法》 ⚡如有问题,欢迎指正,一起学习~~ 文章参考整理自小码哥的《恋上数据结构和算法》课程,图片转载自课程PPT,如有侵权,请联系删除~~ 文章目录接口设计代码实现 栈是一种特殊的线性表, 只能在一端进行插入或者删除操作 往栈中添加元素的操作,一般叫做push,入栈 从栈中移除元素的操作,一般叫做pop,出栈(只能移除栈顶的元素) 成员变量无非就是size和一个element.

HelloCode 1940

torch.nn.rnn实现循环神经网络

------------------------------------nn.rnn模型实现。#------------------------------------模型实现。#-----------------------------------训练模型。#-----------------------------------训练模型。#--------------------------------读取数据。实现循环神经网络,并在至少一个数据集上进行实验,从训练时间、预测精度、...

matlab_python22的博客 2971

黑马程序员C++学习总结【核心篇】

附:参考自哔哩哔哩黑马程序员所做的学习笔记

小幸运召唤师的博客 2269

面向业务角色的 SAP Fiori Space 与 Page 创建全流程实战指南

业务角色导航设计:从Space与Page规划到实施 摘要:本文探讨了SAP S/4HANA Cloud和BTP ABAP环境中基于业务角色的导航设计方法。传统Fiori Launchpad的Group+Tile模式存在应用堆积问题,而新的Space与Page模型将导航按工作领域(如应付会计、销售代表)组织,每个Space包含多个任务导向的Page。文章详细介绍了从业务角色建模到Space/Page创建、分配的完整流程,包括核心概念解析、规划思路和具体操作步骤。重点阐述了如何根据业务需求选择创建方式(基于预交

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 183

uniapp [全端兼容] - 实现省市区选择器三四级联动组件,uniapp选择地址自定义省市区三级联动插件,弹框式多级联动选择器区域选择(全平台兼容苹果安卓App、支付宝微信小程序、移动端H5网页)

uni-app省市区选择器,省市区街道三级四级联动选择器,uniapp自定义多列选择器省市两级联动,uniapp picker组件实现多级联动,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uniApp选择器省市区县街道乡镇,uniapp实现省市区选择联动,uniapp城市三级联动(自定义组件)_uniapp三级联动,picker插件省市区联动,uniapp小程序省市区选择器,uni-app 省市区街道的四级联动选择,uniapp怎样实现省市区地址三级联动uni

🏆 前端领域优质创作者 1万+

黑马程序员【数据结构与算法Java版】讲义源码

黑马程序员【数据结构与算法Java版】讲义源码

qq_46323758的博客 1078

基于图像形态学处理的交通灯检测识别matlab仿真

图像形态学处理是基于数学形态学的理论,利用结构元素(如矩形、圆形等)对图像进行处理,通过将结构元素与图像进行特定的逻辑运算,来提取图像中的目标特征、去除噪声、改善图像质量等。在交通灯检测识别中,主要利用交通灯的颜色、形状等特征,通过形态学操作突出这些特征,抑制背景和噪声干扰,从而实现对交通灯的准确检测和识别。图像采集与预处理采集:通过安装在车辆或道路上的摄像头获取交通场景图像。灰度化:将彩色图像转换为灰度图像,减少数据量,便于后续处理。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 160

黑马《数据结构与算法2023版》正式发布

要论开发技术哪家强,可谓众说纷纭。但长久以来,确有一技,堪称技术江湖的“易筋经”,略知一二的人很多,出类拔萃、登峰造极的人很少......江湖人称——数据结构与算法。

技术专家 2068

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

《黑马程序员python教程,8天python从入门到精通,学python看这套就够了》学习笔记总目录

本文是对《黑马程序员python教程,8天python从入门到精通,学python看这套就够了》所有知识点的笔记进行总结分类。 学习时总结的目录笔记以及思维导图和实训,将在后续更新。

放下华子我只抽RuiKe5的博客 8823

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

大厂AI必备数据结构与算法——各类队列实现方式及习题(八)详细文档

双端队列、队列、栈对比定义特点队列一端删除(头)另一端添加(尾)栈一端删除和添加(顶)双端队列两端都可以删除、添加优先级队列优先级高者先出队延时队列根据延时时间确定优先级并发非阻塞队列队列空或满时不阻塞并发阻塞队列队列空时删除阻塞、队列满时添加阻塞Java 中 LinkedList 即为典型双端队列实现,不过它同时实现了 Queue 接口,也提供了栈的 push pop 等方法注2:不同语言,操作双端队列的方法命名有所不同,参见下表操作JavaJavaScript。

程序员-杨胡广的博客 1353

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Redis-黑马程序员

Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。

Kim-Hyunyeon的博客 2146

大厂AI必备数据结构与算法——队列实现(六)详细文档

计算机科学中,queue 是以顺序的方式维护的一组数据集合,在一端添加数据,从另一端移除数据。习惯来说,添加的一端称为尾,移除的一端称为头,就如同生活中的排队买商品queue先定义一个简化的队列接口/*** 向队列尾插入值* @param value 待插入值* @return 插入成功返回 true, 插入失败返回 false*//*** 从对列头获取值, 并移除* @return 如果队列非空返回对头值, 否则返回 null*/E poll();/**

程序员-杨胡广的博客 1518

黑马程序员--java集合中的数据结构

------- android培训、java培训、期待与您交流! ----------        乍一看,集合的体系还是相当大的,需要快速掌握对集合各种类的使用环境需要对其底层的数据结构进行了解掌握。我在此就分享一下集合中涉及以及一些常用的数据结构。java集合框架中涉及的数据结构有与ArrayList中数组类似的顺序表,LinkedList中的双端队列链表,Stack的栈,以及TreeM

u012634876的专栏 1369

黑马程序员_栈的学习总结

namespace MyStack { /* 栈的学习 * 栈中的数据只能在表的一端进行添加或者删除操作。 * 栈中的数据是从表的末端进行存储的,通常我们将这一端称为“栈顶” * 栈是先进后出的数据结构(LIFO Last In First Out) */ class Program { static

u013005432的专栏 573
上一篇: 黑马程序员——利用生产者和消费者模式讨论notify()方法的运用
下一篇: 黑马程序员——求两个字符串最大公约数的解法
codeting
博客等级 码龄12年 2粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值