简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列

栈的实现

Stack<E>

  • void push(E)
  • E pop()
  • E peek()
  • int getSize()
  • boolean isEmpty()

push 入栈 pop 出栈 peek(top) 看栈顶元素

getSize()看栈一共元素 isEmpty()是否为空

从用户的角度看,支持这些操作就好

具体底层实现,用户不关心

实际底层有多种实现方式

我们开发者要深入理解、实现

ArrayStack<E> implementInterface Stack<E>

  • void push(E)
  • E pop()
  • E peek()
  • int getSize()
  • boolean isEmpty()

ArrayStack实现了Stack接口

实践 栈的实现

Array

  1. public class Array<E> {
  2. private E[] data;
  3. private int size;
  4. // 构造函数,传入数组的容量capacity构造Array
  5. public Array(int capacity){
  6. data = (E[])new Object[capacity];
  7. size = 0;
  8. }
  9. // 无参数的构造函数,默认数组的容量capacity=10
  10. public Array(){
  11. this(10);
  12. }
  13. // 获取数组的容量
  14. public int getCapacity(){
  15. return data.length;
  16. }
  17. // 获取数组中的元素个数
  18. public int getSize(){
  19. return size;
  20. }
  21. // 返回数组是否为空
  22. public boolean isEmpty(){
  23. return size == 0;
  24. }
  25. // 在index索引的位置插入一个新元素e
  26. public void add(int index, E e){
  27. if(index < 0 || index > size)
  28. throw new IllegalArgumentException("Add failed. Require index >= 0 and index <= size.");
  29. if(size == data.length)
  30. resize(2 * data.length);
  31. for(int i = size - 1; i >= index ; i --)
  32. data[i + 1] = data[i];
  33. data[index] = e;
  34. size ++;
  35. }
  36. // 向所有元素后添加一个新元素
  37. public void addLast(E e){
  38. add(size, e);
  39. }
  40. // 在所有元素前添加一个新元素
  41. public void addFirst(E e){
  42. add(0, e);
  43. }
  44. // 获取index索引位置的元素
  45. public E get(int index){
  46. if(index < 0 || index >= size)
  47. throw new IllegalArgumentException("Get failed. Index is illegal.");
  48. return data[index];
  49. }
  50. public E getLast(){
  51. return get(size - 1);
  52. }
  53. public E getFirst(){
  54. return get(0);
  55. }
  56. // 修改index索引位置的元素为e
  57. public void set(int index, E e){
  58. if(index < 0 || index >= size)
  59. throw new IllegalArgumentException("Set failed. Index is illegal.");
  60. data[index] = e;
  61. }
  62. // 查找数组中是否有元素e
  63. public boolean contains(E e){
  64. for(int i = 0 ; i < size ; i ++){
  65. if(data[i].equals(e))
  66. return true;
  67. }
  68. return false;
  69. }
  70. // 查找数组中元素e所在的索引,如果不存在元素e,则返回-1
  71. public int find(E e){
  72. for(int i = 0 ; i < size ; i ++){
  73. if(data[i].equals(e))
  74. return i;
  75. }
  76. return -1;
  77. }
  78. // 从数组中删除index位置的元素, 返回删除的元素
  79. public E remove(int index){
  80. if(index < 0 || index >= size)
  81. throw new IllegalArgumentException("Remove failed. Index is illegal.");
  82. E ret = data[index];
  83. for(int i = index + 1 ; i < size ; i ++)
  84. data[i - 1] = data[i];
  85. size --;
  86. data[size] = null; // loitering objects != memory leak
  87. if(size == data.length / 4 && data.length / 2 != 0)
  88. resize(data.length / 2);
  89. return ret;
  90. }
  91. // 从数组中删除第一个元素, 返回删除的元素
  92. public E removeFirst(){
  93. return remove(0);
  94. }
  95. // 从数组中删除最后一个元素, 返回删除的元素
  96. public E removeLast(){
  97. return remove(size - 1);
  98. }
  99. // 从数组中删除元素e
  100. public void removeElement(E e){
  101. int index = find(e);
  102. if(index != -1)
  103. remove(index);
  104. }
  105. @Override
  106. public String toString(){
  107. StringBuilder res = new StringBuilder();
  108. res.append(String.format("Array: size = %d , capacity = %d\n", size, data.length));
  109. res.append('[');
  110. for(int i = 0 ; i < size ; i ++){
  111. res.append(data[i]);
  112. if(i != size - 1)
  113. res.append(", ");
  114. }
  115. res.append(']');
  116. return res.toString();
  117. }
  118. // 将数组空间的容量变成newCapacity大小
  119. private void resize(int newCapacity){
  120. E[] newData = (E[])new Object[newCapacity];
  121. for(int i = 0 ; i < size ; i ++)
  122. newData[i] = data[i];
  123. data = newData;
  124. }
  125. }

Stack interface

  1. public interface Stack<E> {
  2. int getSize();
  3. boolean isEmpty();
  4. void push(E e);
  5. E pop();
  6. E peek();
  7. }

ArrayStack<E> implementInterface Stack<E>

  1. public class ArrayStack<E> implements Stack<E> {
  2. private Array<E> array;
  3. public ArrayStack(int capacity){
  4. array = new Array<>(capacity);
  5. }
  6. public ArrayStack(){
  7. array = new Array<>();
  8. }
  9. @Override
  10. public int getSize(){
  11. return array.getSize();
  12. }
  13. @Override
  14. public boolean isEmpty(){
  15. return array.isEmpty();
  16. }
  17. public int getCapacity(){
  18. return array.getCapacity();
  19. }
  20. @Override
  21. public void push(E e){
  22. array.addLast(e);
  23. }
  24. @Override
  25. public E pop(){
  26. return array.removeLast();
  27. }
  28. @Override
  29. public E peek(){
  30. return array.getLast();
  31. }
  32. @Override
  33. public String toString(){
  34. StringBuilder res = new StringBuilder();
  35. res.append("Stack: ");
  36. res.append('[');
  37. for(int i = 0 ; i < array.getSize() ; i ++){
  38. res.append(array.get(i));
  39. if(i != array.getSize() - 1)
  40. res.append(", ");
  41. }
  42. res.append("] top");
  43. return res.toString();
  44. }
  45. }

Main

  1. public class Main {
  2. public static void main(String[] args) {
  3. ArrayStack<Integer> stack = new ArrayStack<>();
  4. for(int i = 0 ; i < 6 ; i ++){
  5. stack.push(i);
  6. System.out.println(stack);
  7. }
  8. System.out.println("isEmpty:" + stack.isEmpty());
  9. System.out.println("Size:" + stack.getSize());
  10. for(int i = 0 ; i < 6 ; i ++){
  11. stack.pop();
  12. System.out.println(stack);
  13. }
  14. System.out.println("isEmpty:" + stack.isEmpty());
  15. }
  16. }

Result

  1. D:\Environments\jdk-11.0.2\bin\java.exe -javaagent:D:\Java\ideaIU-2019.2.win\lib\idea_rt.jar=4439:D:\Java\ideaIU-2019.2.win\bin -Dfile.encoding=UTF-8 -classpath D:\IdeaProjects\imooc\Play-with-Data-Structures\03-Stacks-and-Queues\02-Array-Stack\target\classes Main
  2. Stack: [0] top
  3. Stack: [0, 1] top
  4. Stack: [0, 1, 2] top
  5. Stack: [0, 1, 2, 3] top
  6. Stack: [0, 1, 2, 3, 4] top
  7. Stack: [0, 1, 2, 3, 4, 5] top
  8. isEmptyfalse
  9. Size:6
  10. Stack: [0, 1, 2, 3, 4] top
  11. Stack: [0, 1, 2, 3] top
  12. Stack: [0, 1, 2] top
  13. Stack: [0, 1] top
  14. Stack: [0] top
  15. Stack: [] top
  16. isEmptytrue
  17. Process finished with exit code 0

栈的复杂度分析

ArrayStack<E>

  • void push(E) O(1) 均摊
  • E pop() O(1) 均摊
  • E peek() O(1)
  • int getSize() O(1)
  • boolean isEmpty() O(1)

【栈和队列】2、栈的基本实现 - Java的更多相关文章

  1. ACM YTU 十进制与八进制的转换 (栈和队列) STL栈调用

    十进制与八进制的转换(栈和队列) Description 对于输入的任意一个非负十进制整数,利用栈打印输出与其等值的八进制数. Input 111 Output 157 Sample Input 14 ...

  2. (5)剑指Offer之栈变队列和栈的压入、弹出序列

    一 用两个栈实现队列 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 问题分析: 先来回顾一下栈和队列的基本特点: 栈:后进先出(LIFO) 队列: ...

  3. 剑指Offer 5. 用两个栈实现队列 (栈)

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目地址 https://www.nowcoder.com/practice/54275ddae22f4 ...

  4. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

  5. C语言数据结构基础学习笔记——栈和队列

    之前我们学过了普通的线性表,接下来我们来了解一下两种特殊的线性表——栈和队列. 栈是只允许在一端进行插入或删除的线性表. 栈的顺序存储结构也叫作顺序栈,对于栈顶指针top,当栈为空栈时,top=-1: ...

  6. 栈与队列(Stack and Queue)

    1.定义 栈:后进先出(LIFO-last in first out):最后插入的元素最先出来. 队列:先进先出(FIFO-first in first out):最先插入的元素最先出来. 2.用数组 ...

  7. 【数据结构与算法】001—栈与队列(Python)

    栈与队列 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征 2.队列(queue)是一种具有先进先出 ...

  8. 数据结构之栈和队列及其Java实现

    栈和队列是数据结构中非常常见和基础的线性表,在某些场合栈和队列使用很多,因此本篇主要介绍栈和队列,并用Java实现基本的栈和队列,同时用栈和队列相互实现. 栈:栈是一种基于“后进先出”策略的线性表.在 ...

  9. leecode刷题(26)-- 用栈实现队列

    leecode刷题(26)-- 用栈实现队列 用栈实现队列 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返 ...

  10. Java实现 LeetCode 232 用栈实现队列

    232. 用栈实现队列 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部. pop() – 从队列首部移除元素. peek() – 返回队列首部的元素. empty() – 返 ...

随机推荐

  1. 纯css 实现文本换行

    业务场景:dialog中嵌套的表单,实现信息展示,由于存储路径过长并且在一行显示,导致多出的文字出现在弹出框外面了,页面极丑,所以需要将存储路径实现自动换行. 技术点:<p style=&quo ...

  2. 字节跳动内部微服务架构-Docker实战学习笔记分享 真香

    前言 基于 Spring Cloud 的微服务设计和开发,已经越来越多地得到了更多企业的推广和应用,而 Spring Cloud 社区也在不断的迅速发展壮大之中,近几年时间,Spring Cloud ...

  3. ssh 免密码登陆设置不成功

    记一次centos6设置免密码登陆设置不成功的解决.自己挖的坑自己填. ssh 免密码登陆设置( 正常情况下是这样的,设置成功后登陆主机是不需要密码的) [root@master .ssh]# ssh ...

  4. Go实现ssh执行远端命令及远程终端

    什么是ssh? SSH是一种网络协议,用于计算机之间的加密登录. 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露. 互联 ...

  5. Python 学习笔记(下)

    Python 学习笔记(下) 这份笔记是我在系统地学习python时记录的,它不能算是一份完整的参考,但里面大都是我觉得比较重要的地方. 目录 Python 学习笔记(下) 函数设计与使用 形参与实参 ...

  6. HTTP Error 405.0 - Method Not Allowed 无法显示您正在查找的页面,因为使用了无效方法(HTTP 谓词)。

    将submit改成button即可   因为触发了form表单

  7. 类似818tu.c微信小说分销系统设计之多公众号网页授权自动登录源码分享

    /** 转载请保留原地址以及版权声明,请勿恶意修改 *  作者:杨浩瑞  QQ:1420213383  独立博客:http://www.yxxrui.cn * [后台]http://xiaoshuo. ...

  8. springboot实现mybaitis逆向工程

    springboot实现mybaitis逆向工程 首先引入依赖,一共需要两个依赖(一个是mybaits依赖,一个是mybatis逆向工程插件) <dependency> <group ...

  9. 解决UE4缓存使C盘膨胀的问题

    使用UE4的时候会发现C盘越来越小了,那是因为UE4引擎的缓存文件默认保存在C盘的缘故. 概述 一.出现的问题:UE4的缓存文件会导致C盘膨胀. 二.解决的方式:请严格按照下列步骤来执行.1. 更改U ...

  10. (数据科学学习手札101)funcy:Python中的函数式编程百宝箱

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在使用Python完成日常任务时,经常会遇到 ...