数据结构学习(四):用链表实现栈

版权声明:文章为作者原创,若要转载请获得作者同意。尊重版权,从你我做起! https://blog.csdn.net/qq_37768971/article/details/88207183

一、实现功能

使用链表来实现栈的getSize、isEmpty、push、pop、peek功能

二、具体代码:

1.上一节课实现的链表:

package IMUHERO;
/**
 * @作者:IMUHERO
 * @时间:2019/3/5
 * @内容:带虚拟头结点的链表的基本功能实现
 */
public class LinkedList<E> {
    private class Node{
        public E e;
        public Node next;
        public Node(E e,Node next){
            this.e=e;
            this.next=next;
        }
        public Node(E e){
            this.e=e;
            this.next=null;
        }
        public Node(){
            this(null,null);
        }

        @Override
        public String toString() {
            return e.toString();
        }
    }
    private Node dummyHead;
    private int size;

    //构造方法,新建虚拟头结点,指向null。size=0;
    public LinkedList(){
        size=0;
        dummyHead=new Node();
    }

    public int getSize(){
        return size;
    }

    public boolean isEmpty(){
        return size==0;
    }
    //添加元素
    public void add(int index ,E e){
        Node prev=dummyHead;
        if (index<0||index>size )throw new IllegalArgumentException("index is an illegal input");
        for (int i=0;i<index ;i++){
            prev=prev.next;
        }
        prev.next=new Node(e,prev.next);
        size++;
    }
    public void addFirst(E e){
        add(0,e);
    }
    public void addLast(E e){
        add(size,e);
    }
    //获得元素
    public E get(int index){
        if (index<0||index>size )throw new IllegalArgumentException("index is an illegal input");
        Node cur =dummyHead.next;
        for (int i=0;i<index;i++){
            cur=cur.next;
        }
        size--;
        return cur.e;
    }
    public E getFirst(){
        return get(0);
    }

    //设置元素
    public void set(int index,E e){
        if (index<0||index>size )throw new IllegalArgumentException("index is an illegal input");
        Node cur =dummyHead.next;
        for (int i=0;i<index;i++){
            cur=cur.next;
        }
        cur.e=e;
        size++;
    }

    //查询是否含有e元素
    public boolean contain(E e){
        for (Node cur=dummyHead.next;cur!=null;cur=cur.next){
            if (cur.e.equals(e))return true;
        }
        return false;
    }
    //删除索引为index处的元素
    public E remove(int index ){
        if (index<0||index>size )throw new IllegalArgumentException("index is an illegal input");
        Node prev=dummyHead;
        for (int i=0;i<index;i++){
            prev=prev.next;
        }
        Node redel=prev.next;
        prev.next=redel.next;
        redel.next=null;
        size--;
        return redel.e;
    }
    public E removeFirst(){
        return remove(0);
    }

    //删除e
    public void removeElement(E e){
        Node prev=dummyHead;
        while (prev.next!=null){
            if (prev.next.e.equals(e))break;
                prev=prev.next;
        }
        if (prev.next!=null){
            Node redel=prev.next;
            prev.next=redel.next;
            redel.next=null;
            System.out.println(e+"已经被删除");
        }
        else System.out.println("未查询到元素"+e);

    }

    @Override
    public String toString() {
        StringBuilder strb=new StringBuilder();
            Node cur=dummyHead.next;
            while (cur!=null){
                strb.append(cur.e+"->");
                cur=cur.next;
            }
            strb.append("null");
            return strb.toString();
    }
}

2.定义一个Stack的接口:

package IMUHERO;

public interface Stack<E> {

    int getSize();
    boolean isEmpty();
    void push(E e);
    E pop();
    E peek();
}

3.LinkedListStack重写接口的功能:

package IMUHERO;

public class LinkedListStack<E>implements Stack<E>{
        private LinkedList<E>stack;
        public LinkedListStack(){
            stack=new LinkedList<>();
        }
        @Override
        public int getSize(){
            return stack.getSize();
        }
        @Override
        public boolean isEmpty(){
            return stack.isEmpty();
        }
        @Override
        public void push(E e){
            stack.addFirst(e);
        }
        @Override
        public E pop(){
            return stack.removeFirst();
        }
        @Override
        public E peek(){
            return stack.getFirst();
        }

    @Override
    public String toString() {

            StringBuilder res = new StringBuilder();
            res.append("Stack: ");
            res.append("top:");
            res.append(stack);
            return res.toString();

    }
}

三、功能测试:

package IMUHERO;

public class Main {

    public static void main(String[] args) {
	// write your code here
        LinkedListStack LLS=new LinkedListStack();
        for (int i=0;i<10;i++){
            LLS.push(i);
            System.out.println(LLS);
        }

        for (int i=0;i<5;i++){
            LLS.pop();
            System.out.println(LLS);
        }

        System.out.println(LLS.getSize());
        System.out.println(LLS.isEmpty());
        System.out.println(LLS.peek());
        System.out.println(LLS);
    }
}

四、输出结果:

Stack: top:0->null
Stack: top:1->0->null
Stack: top:2->1->0->null
Stack: top:3->2->1->0->null
Stack: top:4->3->2->1->0->null
Stack: top:5->4->3->2->1->0->null
Stack: top:6->5->4->3->2->1->0->null
Stack: top:7->6->5->4->3->2->1->0->null
Stack: top:8->7->6->5->4->3->2->1->0->null
Stack: top:9->8->7->6->5->4->3->2->1->0->null
Stack: top:8->7->6->5->4->3->2->1->0->null
Stack: top:7->6->5->4->3->2->1->0->null
Stack: top:6->5->4->3->2->1->0->null
Stack: top:5->4->3->2->1->0->null
Stack: top:4->3->2->1->0->null
5
false
4
Stack: top:4->3->2->1->0->null

实现了栈的基本功能!!!

猜你喜欢

转载自blog.csdn.net/qq_37768971/article/details/88207183