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

本文详细介绍如何使用链表数据结构实现栈的基本操作,包括getSize、isEmpty、push、pop和peek等方法,并通过具体代码示例展示了其实现过程及功能测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实现功能

使用链表来实现栈的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

 

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

注:关于数据结构的所有代码都放在我的Github上,有需要的同学可以自行Fork,如果觉得还不错,可以打个☆Star哦~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMUHERO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值