资讯专栏INFORMATION COLUMN

Stack的实现

gyl_coder / 761人阅读

摘要:返回栈顶元素,未出栈出栈,返回栈顶元素,同时从栈中移除该元素栈顶元素,代表空栈栈容量,默认为存放元素的数组添加元素,从栈顶数组尾部插入扩容从栈顶添加元素复制元素更新栈顶

Stack Interface
package com.nasuf.arraylist;

public interface Stack {

    boolean isEmpty();
    
    void push(T data);
    
    /**
     * 返回栈顶元素,未出栈
     * @return
     */
    T peek();
    
    /**
     * 出栈,返回栈顶元素,同时从栈中移除该元素
     * @return
     */
    T pop();
    
}
Sequence Stack
package com.nasuf.arraylist;

import java.io.Serializable;
import java.util.EmptyStackException;

public class SeqStack implements Stack, Serializable {

    private static final long serialVersionUID = 7850303094177457725L;
    
    /**
     * 栈顶元素,-1代表空栈
     */
    private int top = -1;
    
    /**
     * 栈容量,默认为10
     */
    private int capacity = 10;
    
    /**
     * 存放元素的数组
     */
    private T[] array;
    
    private int size;
    
    public SeqStack(int capacity) {
        array = (T[]) new Object[capacity];
    }
    
    public SeqStack() {
        array = (T[]) new Object[this.capacity];
    }
    
    public int size() {
        return size;
    }
    

    @Override
    public boolean isEmpty() {
        return this.top == -1;
    }

    /**
     * 添加元素,从栈顶(数组尾部)插入
     * @param data
     */
    @Override
    public void push(T data) {
        if (array.length == size) 
            ensureCapacity(size*2+1); //扩容
        
        // 从栈顶添加元素
        array[++top] = data;
        size ++;
    }

    @Override
    public T peek() {
        if (isEmpty())
            throw new EmptyStackException();
        return array[top];
    }

    @Override
    public T pop() {
        if(isEmpty())
            throw new EmptyStackException();
        size --;
        return array[top--];
    }
    
    private void ensureCapacity(int capacity) {
        if (capacity < size)
            return;
        T[] old = array;
        array = (T[]) new Object[capacity];
        // 复制元素
        for (int i=0; i
LinkedStack
import java.io.Serializable;
import java.util.EmptyStackException;

public class LinkedStack implements Stack, Serializable{
    
    private static final long serialVersionUID = -4338010259113832656L;

    private static class Node {
        
        public AnyType data;
        public Node next;
        
        public Node() {
            
        }
        
        public Node(AnyType d) {
            data = d;
        }
        
        public Node(AnyType d, Node n) {
            data = d;
            next = n;
        }
    }
    
    private Node top;
    
    private int size;
    
    public LinkedStack() {
        this.top = new Node ();
    }
    
    public int size() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return top == null || top.data == null;
    }

    @Override
    public void push(T data) {
        if (data == null) {
            throw new StackOverflowError();
        }
        if (this.top == null) {
            this.top = new Node (data);
        } else if (this.top.data == null) {
            this.top.data = data;
        } else {
            Node p = new Node<>(data, this.top);
            top = p; //更新栈顶
        }
        size ++;
    }

    @Override
    public T peek() {
        if (isEmpty()) {
            throw new EmptyStackException();
        }
        return top.data;
    }

    @Override
    public T pop() {
        if (isEmpty()) {
            throw new EmptyStackException();
        }
        T data = top.data;
        top = top.next;
        size --;
        return data;
    }

}

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

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

相关文章

  • 算法面试:栈实现队列方案

    摘要:解决方案二入队都在中进行,用于队列,同时保证所有元素都在一个栈里,且遵循以下约束入队不管空与否,都将中的所有元素压入中出队若中不为空,则直接从中弹出元素若为空,则说明队列为空,不能出队。 声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本篇文章介绍一个有趣的问题:用两个栈实现一个队列。这道题来自互联网公司的算法面试...

    韩冰 评论0 收藏0
  • LeetCode 232:用栈实现队列 Implement Queue using Stacks

    摘要:题目使用栈实现队列的下列操作将一个元素放入队列的尾部。用栈实现队列,可以用两个栈完成题解。入队列时用存入节点,出队列时内节点顺序出栈压入中。这类编程语言就压根不需要用队列实现栈或用栈实现队列这种问题,因为栈和队列本身就必须借助实现。 题目: 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队...

    cloud 评论0 收藏0
  • Java集合Stack源码深入解析

    概要 学完Vector了之后,接下来我们开始学习Stack。Stack很简单,它继承于Vector。学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码;最后再通过实例来学会使用它。 第1部分 Stack介绍 Stack简介 Stack是栈。它的特性是:先进后出(FILO, First In Last Out)。 java工具包中的Stack是继承于Vector(矢量队列)的,由...

    edgardeng 评论0 收藏0
  • 每周一练 之 数据结构与算法(Stack

    摘要:二实现一个栈,并实现下面方法添加一个新元素到栈顶。移除栈顶的元素,同时返回被移除的元素。十进制转换为二进制请输入正确的数值方法简单实现下面这个方法,其实不太好,因为没有怎么用到这次要练习的栈方法,哈哈。 最近公司内部在开始做前端技术的技术分享,每周一个主题的 每周一练,以基础知识为主,感觉挺棒的,跟着团队的大佬们学习和复习一些知识,新人也可以多学习一些知识,也把团队内部学习氛围营造起来...

    hzx 评论0 收藏0
  • 剑指offer/LintCode40_用两个栈模拟队列

    摘要:剑指用两个栈模拟队列声明文章均为本人技术笔记,转载请注明出处解题思路实现功能用两个栈模拟实现一个队列的,和操作解题思路假设有两个栈队列实现始终用入栈实现队列和实现由于依次出栈并压入中,恰好保证中顺序与模拟队列顺序一致,始终保证栈顶元素为模拟 剑指offer/LintCode40_用两个栈模拟队列 声明 文章均为本人技术笔记,转载请注明出处https://segmentfault.com...

    bawn 评论0 收藏0
  • 【算法】剑指 Offer II 110. 所有路径|797. 所有可能路径(多语言实现

    摘要:遍历路径,找到所有可以到达终点节点的路径就是结果。提示中说保证输入为有向无环图,所以我们可以认为节点间一定有着某种排列的顺序,从头到尾怎样可以有最多的路径呢,那就是在保证没有环路的情况下,所有节点都尽可能多的连接着其他节点。 ...

    wangdai 评论0 收藏0

发表评论

0条评论

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