zoukankan      html  css  js  c++  java
  • 4、栈的实现:顺序存储和链式存储

    Stack的ADT:

     1 package ren.laughing.datastructure.base;
     2 
     3 import ren.laughing.datastructure.exception.StackEmptyException;
     4 
     5 /**
     6  * Stack 栈:后进先出
     7  * 只能在栈顶top进行插入(入栈)、删除(出栈)操作
     8  * @author Laughing_Lz
     9  * @time 2016年4月6日
    10  */
    11 public interface Stack {
    12     //返回堆栈的大小
    13     public int getSize();
    14     //判断堆栈是否为空
    15     public boolean isEmpty();
    16     //数据元素 e入栈
    17     public void push(Object e);
    18     //栈顶元素出栈
    19     public Object pop() throws StackEmptyException;
    20     //取栈顶元素
    21     public Object peek() throws StackEmptyException;
    22     }

     栈的顺序存储:

     1 package ren.laughing.datastructure.baseImpl;
     2 
     3 import ren.laughing.datastructure.base.Stack;
     4 import ren.laughing.datastructure.exception.StackEmptyException;
     5 /**
     6  * 栈的顺序存储结构
     7  * 一般来说在构造堆栈时不应设定堆栈的最大容量。
     8  * 一种合理的做法为先为堆栈分配一个基本容量,然后在实际的使用过程中,
     9  * 当堆栈的空间不够时再倍增存储空间,这个过程所需的时间均摊到每个数
    10  * 据元素时间为Θ(1),不会影响操作实现的时间复杂度。
    11  * @author Laughing_Lz
    12  * @time 2016年4月6日
    13  */
    14 public class StackArray implements Stack {
    15     private final int LEN = 8;//默认数组的存储大小
    16     private Object[] elements;//数据元素数组
    17     private int top;//栈顶指针
    18     
    19     public StackArray() {
    20         this.elements = new Object[LEN];
    21         this.top = -1;//top为-1时表示空栈
    22     }
    23 
    24     @Override
    25     public int getSize() {
    26         return top+1;
    27     }
    28 
    29     @Override
    30     public boolean isEmpty() {
    31         if(top < 0){
    32             return true;
    33         }else{
    34             return false;
    35         }
    36     }
    37 
    38     @Override
    39     public void push(Object e) {
    40         if(getSize()>=elements.length){
    41             expandSpace();
    42         }
    43         //++top:因为入栈操作相当于insertAfter,
    44         //只能在顶点后插入,所以首先将top加1,再放入数据元素
    45         elements[++top] = e;
    46     }
    47 
    48     @Override
    49     public Object pop() throws StackEmptyException {
    50         if(top<0){
    51             throw new StackEmptyException("错误:栈为空,不可出栈操作");
    52         }else{
    53             Object obj = elements[top];
    54             elements[top--] = null;//先取出原栈顶数据元素,再置空、top减一
    55             return obj;
    56         }
    57     }
    58     //取栈顶元素
    59     @Override
    60     public Object peek() throws StackEmptyException {
    61         if(getSize()<=0){
    62             throw new StackEmptyException("错误:栈顶为空");
    63         }else{
    64             return elements[top];
    65         }
    66     }
    67     /**
    68      * 扩充数组长度
    69      */
    70     private void expandSpace() {
    71         Object[] a = new Object[elements.length * 2];
    72         for (int i = 0; i < elements.length; i++)
    73             a[i] = elements[i];
    74         elements = a;
    75     }
    76 }

    栈的链式存储:

     1 package ren.laughing.datastructure.baseImpl;
     2 
     3 import ren.laughing.datastructure.base.Stack;
     4 import ren.laughing.datastructure.exception.StackEmptyException;
     5 /**
     6  * Stack的链式存储
     7  * ★此链表为的不含头结点的单链表
     8  * @author Laughing_Lz
     9  * @time 2016年4月6日
    10  */
    11 public class StackLinked implements Stack{
    12     private SLNode top;//链表首结点引用
    13     private int size;//栈的大小
    14     
    15     public StackLinked() {
    16         this.size = 0;
    17 //        this.top = new SLNode(null, null);
    18         top = null;//这个是否也实例化了呢?和上面是否有区别?
    19     }
    20 
    21     @Override
    22     public int getSize() {
    23         return size;
    24     }
    25 
    26     @Override
    27     public boolean isEmpty() {
    28         return size==0;
    29     }
    30     
    31     @Override
    32     public void push(Object e) {
    33         SLNode node = new SLNode(e, top);//相当于insertBefore 在原栈顶前插入新的数据元素
    34         top = node;
    35         size++;
    36     }
    37 
    38     @Override
    39     public Object pop() throws StackEmptyException {
    40         if (size<=0){
    41             throw new StackEmptyException("错误,堆栈为空。");
    42         }
    43         Object obj = top.getData();
    44         top = top.getNext();
    45         size--;
    46         return obj;
    47     }
    48 
    49     @Override
    50     public Object peek() throws StackEmptyException {
    51         if (size<=0){
    52             throw new StackEmptyException("错误,堆栈为空。");
    53         }
    54         Object obj = top.getData();
    55         return obj;
    56     }
    57 
    58 }
    —————————————————————————————————————行走在人猿的并行线——Laughing_Lz
  • 相关阅读:
    Redis(二) 扩展
    Redis(一)基础
    Java垃圾回收机制 入门
    freeregex-0.01 使用文档
    上传文件到阿里云linux服务器
    jQuery代码解释(基本语法)
    JQuery中使用FormData异步提交数据和提交文件
    jQuery获取data-*属性值
    jquery 中 $.map 的使用方法
    mysql创建表时反引号的作用
  • 原文地址:https://www.cnblogs.com/Laughing-Lz/p/5362966.html
Copyright © 2011-2022 走看看