美文网首页
算法系列笔记(一)栈的实现

算法系列笔记(一)栈的实现

作者: shaclow | 来源:发表于2018-07-16 11:10 被阅读0次

今天我们先来学习一下栈的完整实现方式

首先先上代码

public class Stack<T> {
    private int n=0;
    private T[]a;
    public Stack(int c) {
        a=(T[])new Object[c];
    }
    public void push(T d){
        if(n==a.length)resize(3*a.length);
        a[n++]=d;
    }
    public T top(){
        return a[--n];
    }
    public void resize(int size){
        T[] temp=(T[])new Object[size];
        for(int i=0;i<n;i++){
            temp[i]=a[i];
        }
        a=temp;
    }   
}

这是实现了泛型和不定容的栈,内部实现的思路很简单,其实就是用一个数组的操作来模拟实现而已。唯一有趣的就是就是resize实现方式,是重新new一个数组然后将内容原有内容复制过去,然后再将a指针的指向新的数组中

迭代器

然而完整的stack实现是需要迭代器的,迭代器可以为遍历栈元素提供优雅而高效的解决方案。
有了它你就可以类似这样使用

Iterator<xx>i=cc.iterator();           //cc是实现迭代器的类的一个对象
while(i.hasNext()){
    xx s=i.next();
    System.out.println(s);
}
或者
for(xx s:cc){
  #coding...
}

要要让类拥有迭代器就很有趣了,因为它要涉及两个接口 Iterable<> 和Iterator<>
Iterable是可迭代化的意思,Iterator是迭代器的意思。
是的,如果你想要集合A实现迭代器操作,你的A实现Iterable接口以外,A中必须要有一个内部类B实现Iterator接口,为A提供确实的迭代器操作

下面分别介绍两个接口

Iterable<T>方法:
public Iterator<T>iterator(){
return   B;                                   //B是实现Iterator接口的迭代器
}

Iterator<T>

  • boolean hasNext() 判断是否下一个元素
  • T next() 返回下一个元素
  • void remove() 删除元素

最后用一个实现迭代器的完整代码结束这篇文章,(remove操作有点麻烦,就没写了,不过思路大概是删除元素要将之后的所有元素往前移动一格)
这是一个顺序迭代器

import java.util.Iterator;

public class Stack<T>implements Iterable<T> {
    private int n=0;
    private T[]a;
    public Stack(int c) {
        a=(T[])new Object[c];
    }
    public int size(){
        return n;
    }
    public boolean isempty(){
        return n==0;
    }
    public void push(T d){
        if(n==a.length)resize(3*a.length);
        a[n++]=d;
    }
    public T top(){
        return a[--n];
    }
    public void resize(int size){
        T[] temp=(T[])new Object[size];
        for(int i=0;i<n;i++){
            temp[i]=a[i];
        }
        a=temp;
    }
    public Iterator<T>iterator(){
        return new Itr();
    }
    private class Itr implements Iterator<T>{
        private int i=n;
        private int j=-1;
        public boolean hasNext(){
            return j<(i-1);
        }
        public T next(){
            return a[++j];
        }
        public void remove(){
            
        }
    }
}

相关文章

  • 队列之-队列实现栈

    一、队列实现栈核心算法概述 之前已经描述过了用栈实现队列的功能,见栈系列之-实现队列,那么同样队列也可以用来实现栈...

  • 算法系列笔记(一)栈的实现

    今天我们先来学习一下栈的完整实现方式 首先先上代码 这是实现了泛型和不定容的栈,内部实现的思路很简单,其实就是用一...

  • 算法-栈和队列算法总结

    栈和队列算法总结 1 模拟 1.1 使用栈实现队列 1.2 使用队列实现栈 2 栈的应用 2.1 栈操作 2.2 ...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • TsingHuaDSA-栈和队列

    该文章为清华大学数据结构与算法设计MOOC课程读书笔记. 1. 栈 1.1 接口 LIFO后进先出 1.2 栈实现...

  • 算法 -- 数组&链表 -- 01

    前端同学工作需掌握的相关算法内容。同系列文章(TODO): 算法复杂度 算法 -- 栈&队列 -- 02 算法 -...

  • 数据结构与算法 (栈实现篇)

    数据结构与算法 (栈实现篇) 在数据结构与算法中,栈(stack)又名堆栈,栈是一种受限的线性储存结构,只允许在一...

  • 动态栈的存储结构及算法C语言实现

    动态栈的存储结构及算法C语言实现

  • Android面试题总结(题目+复习链接)

    数据结构 1.栈实现原理 java数据结构与算法之栈(Stack)设计与实现 - CSDN博客 2.链表实现原理 ...

  • 算法

    基本排序和查找算法? 如何用栈实现队列? TimSort原理?

网友评论

      本文标题:算法系列笔记(一)栈的实现

      本文链接:https://www.haomeiwen.com/subject/hzdvpftx.html