资讯专栏INFORMATION COLUMN

Java编程思想-Stack的三种实现(数组,容器,链表)

zhiwei / 877人阅读

摘要:要实现,至少应该包括出栈操作,弹出栈顶元素。入栈操作查看栈顶元素栈为空另外,实现一个栈,还应该考虑到几个问题栈的初始大小以及栈满以后如何新增栈空间对栈进行更新时需要进行同步有三种实现的方式,数组,容器,以及链表的方法。

虽是读书笔记,但是如转载请注明出处http://segmentfault.com/blog/exploring/
..拒绝伸手复制党
想更一进步的支持我,请扫描下方的二维码,你懂的~

Stack

栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。
java 没有栈这样的数据结构,如果想利用先进后出(FILO)这样的数据结构,就必须自己实现。

要实现Stack,至少应该包括:
1. pop() 出栈操作,弹出栈顶元素。
2. push(E e) 入栈操作
3. peek() 查看栈顶元素
4. isEmpty() 栈为空

另外,实现一个栈,还应该考虑到几个问题:
1. 栈的初始大小以及栈满以后如何新增栈空间
2. 对栈进行更新时需要进行同步

有三种实现的方式,数组,容器,以及链表的方法。

数据:

javapackage gsm;
import java.util.*;

public class StackArray{
    private int[] array;//用数组实现
    private int top; //栈顶指针
    private final static int size = 100;
    public StackArray(){
        array = new int[size];
        top = -1; //栈空的时候 
    }
    //压栈
    public void push(int element){
        if(top == size-1){
            throw new StackOverflowError();
        }
        else 
            array[++top] = element;
    }
    //弹栈
    public int pop(){
        if(top == -1){
            throw new EmptyStackException();
        }
        return array[top--];
    }
    //判断是否为空
    public boolean isEmpty(){
        return top == -1;
    }
    //返回栈顶元素
    public Integer peek(){
        if(top == -1){
            throw new EmptyStackException();
        }
        return array[top];
    }
}

容器

javapackage gsm;

public interface Stack {
    public T pop();
    public void push(T element);
    public boolean isEmpty();
    public T peek();
}

package gsm;
import java.util.*;

public class StackList implements Stack {
    private List list ; //用容器实现
    StackList(){
        list = new ArrayList();
    }
    //弹栈
    public T pop(){
        if(this.isEmpty() == true){
            throw new EmptyStackException();
        }

        return list.remove(list.size()-1);
    }
    //压栈
    public void push(T element){
        list.add(element);
    }
    //判断是否为空
    public boolean isEmpty(){
        return list.size() == 0;
    }
    //返回栈顶元素
    public T peek(){
        if(this.isEmpty() == true){
            throw new EmptyStackException();
        }
        return list.get(list.size()-1);
    }
}

链表

javapackage gsm;

import java.util.EmptyStackException;

public class LinkedStack implements Stack{
    //不用容器或者数组等数据结构存储节点
    //Node定义一个节点类
    private static class Node{
        private U item; //存储的data
        private Node next; //类似指针
        Node(){
            this.item = null;
            this.next = null;
        }
        Node(U item, Node next){
            this.item = item;
            this.next = next;
        }
        boolean end(){
            return item == null && next == null;
        }
    } 

    private Node top ; //栈顶指针
    LinkedStack(){
        top = new Node();
    }


    //弹栈
    public T pop(){
        if(this.isEmpty() == true){
            throw new EmptyStackException();
        }
        T result = top.item;
        if(!top.end())
        {
            top = top.next;
        }
        return result;
    }
    //压栈
    public void push(T element){
        top = new Node(element, top);
    }
    //判断是否为空
    public boolean isEmpty(){
        return  top.end();
    }
    //返回栈顶元素
    public T peek(){
        if(this.isEmpty() == true){
            throw new EmptyStackException();
        }
        T result = top.item;
        return result;
    }   
}

可以发现容器果然是java的一个利器,方便高效。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64250.html

相关文章

  • 数据结构分析及其实现(Stack、Queue、Tree、LinkedList)

    摘要:常见数据结构分析及实现说明本文中的代码是参考编程思想某培训机构。同时还要分析这些数据结构在时间和空间上的开销。这种专门研究应用程序中的数据之间的逻辑关系,存储方式及其操作的学问就是数据结构。 常见数据结构分析及实现 说明 本文中的代码是参考《Java编程思想》、某培训机构。 文中的代码放Github了,有兴趣的可以看看,点歌star鼓励下我。 代码在Sublime中敲的,坑爹的GBK...

    Richard_Gao 评论0 收藏0
  • Java编程思想》--持有对象

    Java是面向对象的语言,对象时Java不可或缺的一个元素,基本数据类型有数组用来存储,那么对象元素有什么存储呢,这就是集合,集合是Java非常重要的一块知识,Java编程思想中的持有对象简述了集合的相关知识,下面简述集合的相关功能: showImg(/img/bVC153); 集合类我们通常称为容器 其实容器只有四种:Map、List、Set和Queue 常用的容器有ArrayList、Lin...

    dinfer 评论0 收藏0
  • 数据结构第一讲

    摘要:为什么要学习数据结构语言是相通的人们常说,编程语言是相通的,掌握一门,其他语言很容易就能掌握。其实,真正想通的不是语言,而是数据结构与算法。 为什么要学习数据结构 1.语言是相通的 人们常说,编程语言是相通的,掌握一门,其他语言很容易就能掌握。个人认为这是一个似是而非的观点,每门编程语言都离不开变量,数组,循环,条件判断这些概念,这似乎能支持上面的观点,但是每门编程语言都有自己的使用范...

    k00baa 评论0 收藏0
  • 数据结构第一讲

    摘要:为什么要学习数据结构语言是相通的人们常说,编程语言是相通的,掌握一门,其他语言很容易就能掌握。其实,真正想通的不是语言,而是数据结构与算法。 为什么要学习数据结构 1.语言是相通的 人们常说,编程语言是相通的,掌握一门,其他语言很容易就能掌握。个人认为这是一个似是而非的观点,每门编程语言都离不开变量,数组,循环,条件判断这些概念,这似乎能支持上面的观点,但是每门编程语言都有自己的使用范...

    wemall 评论0 收藏0
  • 栈和队列 - Algorithms, Part I, week 2 STACKS AND QUEUE

    摘要:在改进前使用数组的一个缺点是必须声明数组的大小,所以栈有确定的容量。待解决的问题建立一个能够增长或者缩短到任意大小的栈。下边的图是观察时间开销的另一种方式,表示了入栈操作需要访问数组的次数。 前言 上一篇:算法分析下一篇:基本排序 本篇内容主要是栈,队列 (和包)的基本数据类型和数据结构文章里头所有的对数函数都是以 2 为底关于性能分析,可能还是需要一些数学知识,有时间可以回一下在很多...

    Stardustsky 评论0 收藏0

发表评论

0条评论

zhiwei

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<