java语言链栈_Java语言实现数据结构栈代码详解

近来复习数据结构,自己动手实现了栈。栈是一种限制插入和删除只能在一个位置上的表。最基本的操作是进栈和出栈,因此,又被叫作“先进后出”表。

首先了解下栈的概念:

栈是限定仅在表头进行插入和删除操作的线性表。有时又叫LIFO(后进先出表)。要搞清楚这个概念,首先要明白”栈“原来的意思,如此才能把握本质。

"栈“者,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。

实现方式是这样的:首先定义了一个接口,然后通过这个接口实现了线性栈和链式栈,代码比较简单,如下:

package com.peter.java.dsa.interfaces;

/**

* 栈操作定义

*

* @author Peter Pan

*/

public interface Stack {

/* 判空 */

Boolean isEmpty();

/* 清空栈 */

void clear();

/* 弹栈 */

T pop();

/* 入栈 */

Boolean push(T data);

/* 栈的长度 */

int length();

/* 查看栈顶的元素,但不移除它 */

T peek();

/* 返回对象在栈中的位置 */

int search(T data);

}

线性栈:以数组的方式实现。

package com.peter.java.dsa.common;

import com.peter.java.dsa.interfaces.Stack;

/**

* 线性栈

*

* @author Peter Pan

*/

public class LinearStack implements Stack {

@SuppressWarnings("unchecked")

private T[] t = (T[]) new Object[16];

private int size = 0;

@Override

public Boolean isEmpty() {

// TODO Auto-generated method stub

return size == 0;

}

@Override

public void clear() {

// TODO Auto-generated method stub

for (int i = 0; i < t.length; i++) {

t[i] = null;

}

size = 0;

}

@Override

public T pop() {

// TODO Auto-generated method stub

if (size == 0) {

return null;

}

T tmp = t[size - 1];

t[size - 1] = null;

size--;

return tmp;

}

@Override

public Boolean push(T data) {

// TODO Auto-generated method stub

if (size >= t.length) {

resize();

}

t[size++] = data;

return true;

}

@Override

public int length() {

// TODO Auto-generated method stub

return size;

}

@Override

public T peek() {

// TODO Auto-generated method stub

if (size == 0) {

return null;

} else {

return t[size - 1];

}

}

/* return index of data, return -1 if no data */

@Override

public int search(T data) {

// TODO Auto-generated method stub

int index = -1;

for (int i = 0; i < t.length; i++) {

if (t[i].equals(data)) {

index = i;

break;

}

}

return index;

}

@SuppressWarnings("unchecked")

private void resize() {

T[] tmp = (T[]) new Object[t.length * 2];

for (int i = 0; i < t.length; i++) {

tmp[i] = t[i];

t[i] = null;

}

t = tmp;

tmp = null;

}

/* from the left to the right is from the top to the bottom of the stack */

@Override

public String toString() {

// TODO Auto-generated method stub

StringBuffer buffer = new StringBuffer();

buffer.append("Linear Stack Content:[");

for (int i = t.length - 1; i > -1; i--) {

buffer.append(t[i].toString() + ",");

}

buffer.append("]");

buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, "");

return buffer.toString();

}

}

链式栈:通过单链表进行实现。

package com.peter.java.dsa.common;

import com.peter.java.dsa.interfaces.Stack;

public class LinkedStack implements Stack {

private Node top;

private int size;

@Override

public Boolean isEmpty() {

// TODO Auto-generated method stub

return size == 0;

}

@Override

public void clear() {

// TODO Auto-generated method stub

top = null;

size = 0;

}

@Override

public T pop() {

// TODO Auto-generated method stub

T topValue = null;

if (top != null) {

topValue = top.data;

Node oldTop = top;

top = top.prev;

oldTop.prev = null;

size--;

}

return topValue;

}

@Override

public Boolean push(T data) {

// TODO Auto-generated method stub

Node oldTop = top;

top = new Node(data);

top.prev = oldTop;

size++;

return true;

}

@Override

public int length() {

// TODO Auto-generated method stub

return size;

}

@Override

public T peek() {

// TODO Auto-generated method stub

T topValue = null;

if (top != null) {

topValue = top.data;

}

return topValue;

}

@Override

public int search(T data) {

// TODO Auto-generated method stub

int index = -1;

Node tmp = top;

for (int i = size - 1; i > -1; i--) {

if (tmp.data.equals(data)) {

index = i;

break;

} else {

tmp = tmp.prev;

}

}

tmp = null;

return index;

}

@Override

public String toString() {

// TODO Auto-generated method stub

StringBuffer buffer = new StringBuffer();

buffer.append("Linked Stack Content:[");

Node tmp = top;

for (int i = 0; i < size - 1; i++) {

buffer.append(tmp.toString() + ",");

tmp = tmp.prev;

}

tmp = null;

buffer.append("]");

buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, "");

return super.toString();

}

private class Node {

T data;

Node prev;

public Node(T data) {

// TODO Auto-generated constructor stub

this.data = data;

}

}

}

学习还在进行中,以后会继续更新代码。

就是本文关于Java语言实现数据结构栈代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文看懂BATH新基建:5G是基础,AI是内核

文章原载于 视觉中国“新基建”政策升温&#xff0c;“竞标赛”将启。“新基建”这一概念最早提出是在2018年底的中央经济工作会议上&#xff0c;会议指出要“加快5G商用步伐&#xff0c;加强人工智能、工业互联网、物联网等新型基础设施建设”&#xff0c;“新基建”概念由此…

Java基础(三)选择和循环结构

一、选择结构&#xff0c;条件判断 1、if 语句 一个 if 语句包含一个布尔表达式和一条或多条语句。如果布尔表达式的值为 true&#xff0c;则执行 if 语句中的代码块&#xff0c;否则执行 if 语句块后面的代码。 1 import static java.lang.Math.round;2 3 public class Condit…

什么是java dom_java web--DOM

Dom总结dom&#xff1a;文档对象模型的简称。dom的解析&#xff1a;与XML一样遵循同样的规范将标记型文档解析成一棵DOM树&#xff0c;并将树中的内容都封装成节点对象。如果html文档过大&#xff0c;同样会造成解析过慢&#xff0c;怎么使用sax方式解析&#xff1f;节点的分类…

蒲慕明:对科学哲学的一些看法

来源 | 中国科学报作者 | 蒲慕明9月24日上午&#xff0c;“中国科学院哲学研究所揭牌仪式暨科学与哲学前沿问题研讨会”在中国科学院大学玉泉路校区举行。揭牌仪式上&#xff0c;中科院院士、中科院脑科学与智能技术卓越创新中心&#xff08;神经科学研究所&#xff09;学术主任…

CF16A Flag

CF16A Flag 题意翻译 题目描述 根据一项新的ISO标准&#xff0c;每一个国家的国旗应该是一个nm的格子场&#xff0c;其中每个格子最多有10种不同的颜色。并且国旗应该有条纹&#xff1a;旗帜的每一行应包含相同颜色的方块&#xff0c;相邻的行的颜色应该是不同的。Berland政府要…

与时间相关的java源码_Java 调整日期和时间

import java.time.DayOfWeek;import java.time.LocalDate;import java.time.temporal.TemporalAdjuster;import java.time.temporal.TemporalAdjusters;//n o w j a v a . c o m 提 供public class Main {public static void main(String[] args) {LocalDate today LocalDate.…

include动作与include指令的区别

转载于:https://www.cnblogs.com/olddriver123/p/8413098.html

【创新应用】未来10年,这些黑科技必将颠覆我们的生活

来源&#xff1a;智能研究院从无人驾驶汽车到机器人工人&#xff0c;在我们熟悉所有这一切之前&#xff0c;未来正迎面走来。根据世界经济论坛全球议程理事会关于《未来软件与社会》的一份报告&#xff0c;到2025年前&#xff0c;很多新兴技术将会达到其临界点。该理事会调查走…

java中的账户冻结原理_java可重入锁(ReentrantLock)的实现原理

前言相信学过java的人都知道 synchronized 这个关键词&#xff0c;也知道它用于控制多线程对并发资源的安全访问&#xff0c;兴许&#xff0c;你还用过Lock相关的功能&#xff0c;但你可能从来没有想过java中的锁底层的机制是怎么实现的。如果真是这样&#xff0c;而且你有兴趣…

stm32f10x单片机进阶--spi使用

使用SPI与外部flash(MX25L6406EM21)IC通信 连接方式如上图所示&#xff0c;MCU通过SPI2与外部flash芯片进行相连接。 MCU spi2初始化定义SPI2 中所使用的SPI 端口号 spi2中 通信功能初始化 读数据与写数据 指令说明查看flash芯片的datasheet&#xff0c;mx25芯片支持按照页来写…

怎样才算世界一流大学

来源&#xff1a;图灵人工智能本文摘编自石毓智著《斯坦福的创新力&#xff1a;来自世界一流大学的启示》之放眼欧美部分&#xff0c;内容有删减&#xff0c;由安静编辑。世界一流大学大都历史悠久&#xff0c;动辄都有几百年的历史。在这个家族中&#xff0c;斯坦福是个年轻的…

蓝桥杯练习系统数的读法java_数的读法(蓝桥杯)

问题描述Tom教授正在给研究生讲授一门关于基因的课程&#xff0c;有一件事情让他颇为头疼&#xff1a;一条染色体上有成千上万个碱基对&#xff0c;它们从0开始编号&#xff0c;到几百万&#xff0c;几千万&#xff0c;甚至上亿。比如说&#xff0c;在对学生讲解第1234567009号…

实现安卓里边下边播的播放器(源码公开)

一、前言&#xff1a; 前段时间弄了一款安卓电视盒子的远程遥控输入法APP&#xff1a;TVRemoteIME&#xff0c;此APP实现了远程跨屏的输入、遥控和应用管理功能。 最近发现盒子上要播放电影资源除了买APP会员之外&#xff0c;能直接免费播放电影的第三方APP越来越少了&#xff…

2020诺奖预测出炉!一位华人学者入选

图片来源&#xff1a;nobelprize.org文章来源&#xff1a;科睿唯安&#xff08;Clarivate Analytics&#xff09;、科研圈9月23日&#xff0c;拥有Web of Science、InCites等著名论文及期刊索引平台的科睿唯安公司&#xff08;Clarivate Analytics&#xff09;宣布了2020年“引…

java的oauth2.0_[转]Java的oauth2.0 服务端与客户端的实现

oauth原理简述oauth本身不是技术&#xff0c;而是一项资源授权协议&#xff0c;重点是协议&#xff01;Apache基金会提供了针对Java的oauth封装。我们做Java web项目想要实现oauth协议进行资源授权访问&#xff0c;直接使用该封装就可以。image.png整个开发流程简述一下&#x…

数学突破奖:告诉你一个真实的数学研究

文章来源&#xff1a;科学松鼠会科学是目前人类探知客观世界最好的方式。尽管投入科学不能一蹴而就地得到切实有用的成果&#xff0c;但长远来看却是技术发展最好的动力源。与技术开发不同&#xff0c;对科学的投入更像是公益活动&#xff0c;因为科学研究得到的成果属于全人类…

java 获取当前月份减1_java String 日期 转成 Date, 月份减1

ainiyanyan13142007-03-30 22:391 编写applet 程序的页面输出 红色的 "hello would !"2 请编写application 计算并 "12...2008"的结果3 找出两个字符串中所有共同的子字符串4 将碾转相除法求两个整数的最大公因数gcd(a,b)用递归方法实现.(1) 求两个整数a,b…

重磅!“全脑介观神经联接图谱”大科学计划中国工作组成立!

来源&#xff1a;上海科技9月27日下午&#xff0c;“全脑介观神经联接图谱”大科学计划启动前期工作座谈会在上海市召开&#xff0c;本次会议明确了该计划的推进路径&#xff0c;宣布了中国工作组的成立&#xff0c;并就该计划的具体实施思路和举措进行研讨。座谈会上&#xff…

算法训练 Pollution Solution(计算几何)

问题描述作为水污染管理部门的一名雇员&#xff0c;你需要监控那些被有意无意倒入河流、湖泊和海洋的污染物。你的其中一项工作就是估计污染物对不同的水生态系统&#xff08;珊瑚礁、产卵地等等&#xff09;造成的影响。你计算所使用的模型已经在图1中被说明。海岸线&#xff…

MEMS传感器前景光明,国内产业如何创新破局

来源&#xff1a;MEMS当前&#xff0c;在行业技术不断发展和成熟的加持下&#xff0c;物联网已经成为世界新一轮科技革命和产业变革的重要驱动力。顺应着万物互联时代的到来&#xff0c;作为物联网先行技术、感知层的代表——传感器的市场需求急剧攀升&#xff0c;所扮演的角色…