下压堆栈(链表实现)

该栈用链表实现,并是泛型的、可迭代的栈。
参考于算法(第四版)的算法1.2
下面是java代码:

import java.util.Iterator;
import edu.princeton.cs.algs4.StdIn;
import interfacefile.DataStock;

public class MyStack implements DataStock,Iterable {
    private Node first;
    private int N=0;
    private class Node {
        Item item;
        Node nextNode;
    }
    @Override
    public void push(Item value) {
        // TODO Auto-generated method stub
        Node oldfirst=first;
        first=new Node();
        first.item=value;
        first.nextNode=oldfirst;
        N++;
    }
    @Override
    public Item pop() {
        // TODO Auto-generated method stub
        Item item=first.item;
        first=first.nextNode;
        N--;
        return item;
    }
    @Override
    public boolean isEmpty() {
        // TODO Auto-generated method stub
        return N==0;
    }
    @Override
    public int size() {
        // TODO Auto-generated method stub
        return N;
    }
    
    
    //迭代器设置
    @Override
    public Iterator iterator() {
        // TODO Auto-generated method stub
        return new LinkIterator();
    }
    private class LinkIterator implements Iterator{
        Node current =first;
        @Override
        public boolean hasNext() {
            // TODO Auto-generated method stub
            return current!=null;
        }

        @Override
        public Item next() {
            // TODO Auto-generated method stub
            Item item=current.item;
            current=current.nextNode;
            return item;
        }
    }
//测试
    public static void main(String[] args) {
        MyStack stack1=new MyStack();
        int i;
        //输入字符串,回车后按ctrl+z结束输入
        while(!StdIn.isEmpty()) {
            String value= StdIn.readString();
            stack1.push(value);
        }
        //遍历当前栈的所有元素并打印(从栈顶开始)
        i=stack1.size();
        System.out.println("origin:");
        for(String temp:stack1) {
            System.out.printf("%d:%s ",i--,temp);
        }
        System.out.println();
        
        //弹出栈顶两个元素,再打印剩下的元素
        stack1.pop();
        stack1.pop();
        i=stack1.size();
        System.out.println("current:");
        for(String temp:stack1) {
            System.out.printf("%d:%s ",i--,temp);
        }
    }
    
}

测试结果:


下压堆栈(链表实现)_第1张图片
测试

附上自定义的DataStock接口

每个栈、队列、背包都要实现该接口

public interface DataStock{
   public void push(T value);
   public T pop();
   public boolean isEmpty();
   public int size();
       
}

思考

  • java中链表的实现,和c语言中不同的是,java中链表节点建立时,默认next是指向null的,因此不用特地使尾节点指向null
  • 熟悉嵌套类,接口,泛型,迭代器的使用

你可能感兴趣的:(下压堆栈(链表实现))