一.栈的定义

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。(来源百度百科)

二.本文内容

本文分别用链表和数组实现了栈

2.1 链表实现

//节点类
public class Node {public Object data;public Node next;public Node(Object data, Node next) {this.data = data;this.next = next;}public Node(Object data) {this.data = data;}
}/*** 方式一: 链表实现*/
public class MyStack01<E> {//栈顶元素private Node top;//元素个数private int count = 0;/*** 进栈* @param element*/public void push(E element){Node node = new Node(element);if (top != null){//若存在栈顶元素,则把新节点的下一个节点指向栈顶元素node.next = top;}//栈顶节点指向新节点top = node;count++;}/*** 出栈* @return*/public E pop(){if (count < 1) throw new RuntimeException("栈顶无元素");Node node = top;top = top.next;count--;return (E)node.data;}/*** 返回栈内元素个数* @return*/public int size(){return count;}/*** 打印栈内元素* @return*/@Overridepublic String toString() {StringBuilder sb = new StringBuilder("]");Node temp = top;while (temp != null){sb.append(temp.data+",");temp = temp.next;}sb.setCharAt(sb.length()-1 , '[');return sb.reverse().toString();}
}//测试类
public class TestMyStack {public static void main(String[] args) {MyStack01<String> myStack = new MyStack01<>();myStack.push("a");myStack.push("b");myStack.push("c");System.out.println("栈内元素为: " + myStack.toString());System.out.println("出栈的元素是: " + myStack.pop());System.out.println("栈内元素为: " + myStack.toString());System.out.println("栈内元素个数为: " + myStack.size());}
}

测试截图:

2.2 数组实现

/*** 方式二: 数组实现*/
public class MyStack02<E> {//操作数组private Object[] data;//栈顶指针int top = -1;//数组大小int size;public MyStack02(int size) {this.size = size;data = new Object[size];}/*** 入栈* @param element*/public void push(E element){if (top + 1 == size) throw new RuntimeException("栈已满");data[top + 1] = element;top ++;}/*** 出栈* @return*/public E pop(){if (top < 0) throw new RuntimeException("栈内无元素");Object obj = data[top];data[top--] = null;return (E)obj;}/*** 返回栈内元素个数* @return*/public int size(){return top+1;}/*** 打印栈内元素* @return*/@Overridepublic String toString() {StringBuilder sb = new StringBuilder("[");for (int i = 0; i <= top; i++) {sb.append(data[i] + ",");}sb.setCharAt(sb.length()-1,']');return sb.toString();}
}//测试类
public class TestMyStack {public static void main(String[] args) {MyStack02<String> myStack = new MyStack02<>(4);myStack.push("a");System.out.println("出栈的元素是: " + myStack.pop());myStack.push("b");myStack.push("c");System.out.println("栈内元素为: " + myStack.toString());System.out.println("出栈的元素是: " + myStack.pop());System.out.println("栈内元素为: " + myStack.toString());System.out.println("栈内元素个数为: " + myStack.size());}
}

测试截图:

java分别用链表和数组实现栈相关推荐

  1. c++使用单向链表存储一组有序数据_《一起学习java和数据结构》系列-数组和链表...

    数组 数组是一个线性表数据结构.它用一段连续的内存地址空间,来存储一些相同类型的数据. 从上面的定义,我们不难看出几个关键词. 线性表:顾名思义,线性表就是数据排列成一条线的数据结构.每一个线性表只有 ...

  2. 《恋上数据结构第1季》动态数组实现栈

    栈(Stack) 栈的应用 – 浏览器的前进和后退 栈的接口设计 动态数组实现栈 练习题 逆波兰表达式求值 有效的括号 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java ...

  3. 牛客网Java刷题知识点之数组、链表、哈希表、 红黑二叉树

    不多说,直接上干货! 首先来说一个非常形象的例子,来说明下数组和链表. 上体育课的时候,老师说:你们站一队,每个人记住自己是第几个,我喊到几,那个人就举手,这就是数组. 老师说,你们每个人记住自己前面 ...

  4. JavaScript数据结构与算法(1)(数组、栈、队列、链表)(ES6)

    注意:原教学视频:JavaScript(ES6)数据结构和算法 | JavaScript数据结构与算法 (都是CoderWhy老师的教学) 原作者(笔记)链接:JavaScript 数据结构与算法 | ...

  5. echart data放入数组_线性表(数组、链表、队列、栈)详细总结

    线性表是一种十分基础且重要的数据结构,它主要包括以下内容: 数组 链表 队列 栈 接下来,我将对这四种数据结构做一个详细的总结,其中对链表实现了十几种常见的操作.希望对你有所帮助. 1.数组 数组(A ...

  6. Data Structure_数组_栈_队列_链表_霍夫曼

    数组 数组在编码中很常见,就是把数据码成一排存放. 这就表示一个数组,这个数组有八个元素存放.对于元素的获取,主要就是通过下标获取,所以索引对于数组是很重要的,这个索引可以是有意义的,也可以是没有意义 ...

  7. 408考研数据结构与算法之数组、链表、队列、栈知识点和算法详细教程(更新中)

    第一章:数据结构与算法概述 因为数据结构作为计算机专业的专业基础课程,是计算机考研的必考科目之一,如果打算报考计算机专业的研究生,你必须学好它. 数据结构是计算机软考.计算机等级考试等相关考试的必考内 ...

  8. Java数据结构和算法:数组、单链表、双链表

    1. 概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的 ...

  9. Java数据结构-基于数组的栈和泛型

    泛型可以参数化变量的类型 当你需要用不同类型的基本类型变量来调用构造方法时你需要泛型 public class Test {public static void main(String[] args) ...

  10. java 模拟栈底层用数组_java用数组模拟栈

    package stack2; public interface StackADT { /** * 添加元素 * @param object */ void push(Object object); ...

最新文章

  1. 后端开挂:3行代码 = 8个接口
  2. 8位以上 密码 正则表达式
  3. 其它综合-VMware虚拟机安装Ubuntu 19.04 版本
  4. SAP Spartacus里的product carousel控件的实现cx-product-carousel
  5. python docx 合并文档 图片_Python+pymupdf处理PDF文档案例6则
  6. QPW 企业员工表(tf_company_employee)
  7. linux 命令案例学习——文件搜索
  8. leetcode —— 38. 外观数列
  9. CV_MAT_ELEM——获取矩阵元素和初始化矩阵
  10. 笔记:J2EE核心模式(待补充)
  11. java内存模型(netty权威指南)
  12. Windows 7 “Tunnel adapter Local Area Connection” 现象(IPv6)
  13. java 中级面试题_java中级面试题
  14. 细说工业基础类IFC
  15. Jie Business Project
  16. web前端全套教程,入门必备
  17. 树莓派 Raspberry Pi 3B+ 无线路由器, WEB 服务器(Nginx,PHP,Sqlite3),UART 串口数据采集
  18. 大数据平台Ambari2.7.4+HDP3.1.4安装(超详细教程)
  19. 迪士尼正在寻找一个区块链实习生
  20. 付宇泽20190919-1 每周例行报告

热门文章

  1. devc 和mysql_DEV C++下C语言连接mysql
  2. docker minio部署作为shareX截图软件的图床
  3. 爬虫问题,内容应该如何解码,base64解码技巧,从哪里开始分析
  4. HHS整合(Struts2+Spring+Hibernate)
  5. Ubuntu出现“dpkg: 依赖关系问题使得libbsd0:i386的配置工作不能继续”错误
  6. 对角化求可逆矩阵_「线性代数」求可逆矩阵P,使得相似矩阵对角化
  7. 程序员也要学英语——数词攻略
  8. CSS3解决连续英文字符或数字不能自动换行的问题
  9. Java实现身份证号合法性校验(包含港澳台地区)
  10. 39岁了,我依然要谈梦想