当前位置: 首页 > 面试题库 >

使用链表实现堆栈

邓鸿雪
2023-03-14
问题内容

使用Java中的链表实现堆栈的最佳方法是什么?

编辑:我将最好的定义为最有效的使用干净的代码。我已经使用数组来实现堆栈,但是对链接列表不熟悉,因此想知道是否有人可以帮助我实现类似于以下内容的内容:

public class StackArray{

    private Object [] objArray;
    private int stackSize;

    public StackArray(){
        objArray = new Object[50];
        stackSize = 0;
    }

    public StackArray(int size){
        objArray = new Object[size];
        stackSize = 0;
    }

    //public interface methods - push, pop, top, empty & clear
    public void push(Object o)throws StackArrayException{
        if(stackSize < objArray.length){
            objArray[stackSize] = o;
            stackSize ++;
        }else{
            throw new StackArrayException("Stack Overflow");
        }
    }

    public Object pop()throws StackArrayException{
        if(stackSize != 0){
            stackSize--;
            return(objArray[stackSize]);
        }else{
            throw new StackArrayException("Stack Underflow");
        }
    }

    public void top() throws StackArrayException{
        if(stackSize != 0){
            return(objArray[stackSize-1]);
        }else{
            throw new StackArrayException("Stack Underflow");
        }
    }

    public boolean empty(){
        return (stackSize == 0):
    }

    public void clear(){
        stackSize = 0;
    }
}

编辑:如果有人感兴趣,这是链表的实现。

public class StackList{
    private Node listHead;

    protected class Node{
    protected Object datum;
    protected Node next;

    public Node(Object o, Node n){
        datum = o;
        next = n;
    }

    public StackList(){
        listHead = null;
    }

    //public interface methods - push pop top empty clear
    public void push(Object o){
        listHead = new Node(o, listHead);
    }

    public Object pop() throws StackListException{
        if(listHead!=null){
            Object top = listHead.datum;
            listHead = listHead.next;
            return top;
        }else{
            throw new StackListException("Stack Underflow");
        }
    }

    public Object top()throws StackListException{
        if(listHead != null){
            return(listHead.datum);
        }else{
            throw new StackListException("Stack Underflow");
        }
    }

    public boolean empty(){
        return (listHead == null);
    }

    public void clear(){
        listHead = null;
    }
}

问题答案:

假设您真的想从头开始,而不是使用现有的完美堆栈实现之一,那么我建议您:

  • 创建一个“ MyStack ”类,该类实现所需的任何接口(也许列出 ?)
  • 在MyStack中,为每个链接列表项创建一个“私有静态最终类Node ”内部类。每个节点都包含对类型T对象的引用和对“下一个”节点的引用。
  • 向MyStack添加“ topOfStack”节点引用。
  • 推入和弹出操作仅需要在此topOfStack节点上进行。如果为空,则堆栈为空。我建议使用与标准Java堆栈相同的方法签名和语义,以避免以后造成混淆。
  • 最后实现您需要的任何其他方法。奖励积分,以这样的方式实现“可迭代 ”它记住在没有任何额外的存储分配创建迭代器中的时刻堆栈的不可变的状态(这 可能的:-))


 类似资料:
  • 关于这一点已经有很多问题(例如使用树实现堆),但是没有一个问题有一个公认的答案。所以,我在这里再问一次,让问题更清楚。< br >二叉树已经实现,并且二叉树的私有内部类包括 所以,我有元素,父,左孩子,右孩子的引用。 内部类包含每个获取器和设置器。 内部类正在实现

  • 本文向大家介绍使用python实现链表操作,包括了使用python实现链表操作的使用技巧和注意事项,需要的朋友参考一下 一、概念梳理 链表是计算机科学里面应用应用最广泛的数据结构之一。它是最简单的数据结构之一,同时也是比较高阶的数据结构(例如棧、环形缓冲和队列) 简单的说,一个列表就是单数据通过索引集合在一起。在C里面这叫做指针。比方说,一个数据元素可以由地址元素,地理元素、路由信息活着交易细节等

  • 所以我有一个堆栈,它允许典型的Push和Pop函数。我很难理解这一切实际上是如何在代码方面工作的。我在这里看到了这篇文章,最佳答案中的图片/图表,展示了列表是如何被“推”下来的,你指向最新的元素。我有一个 它挂接到结构“节点” 我如何结合一个推拉与"节点*下一步;"?最难理解的是我将如何真正做到这一点。我知道它最初指向空,然后如果我推一个2,4,6,它将是6,4,2,#。掌握如何实际使用链表中的指

  • C语言面向对象编程(五):单链表实现 前面我们介绍了如何在 C 语言中引入面向对象语言的一些特性来进行面向对象编程,从本篇开始,我们使用前面提到的技巧,陆续实现几个例子,最后呢,会提供一个基本的 http server 实现(使用 libevent )。在这篇文章里,我们实现一个通用的数据结构:单链表。 这里实现的单链表,可以存储任意数据类型,支持增、删、改、查找、插入等基本操作。(本文提供的是完

  • 本文向大家介绍java使用链表实现约瑟夫环,包括了java使用链表实现约瑟夫环的使用技巧和注意事项,需要的朋友参考一下 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。求出出队序列。 采用链表实现,结点数据就是编号

  • 我已经用C#实现了单链表。任何人都可以查看下面的代码并指出我的错误所在吗? 此函数不删除最后一个节点。我不知道出了什么问题。当while循环结束时,curNode中的node引用的next为null。这意味着这是最后一个节点。最后,我将此节点设置为null。但当我使用显示功能时。它还显示最后一个节点。这不是删除最后一个节点。 这里是我的显示功能: