链式栈和链式队列

链式栈和链式队列的优点:不用像顺序栈和顺序队列一样,进行扩容。

链式栈

class LinkStack<T>{
    // 链表的第一个节点充当栈顶元素
    private Entry<T> bottom; // 栈底
    private int count; // 记录链表节点的个数

    public LinkStack(){
        bottom = new Entry<>(null, null);
    }

    // 入栈操作
    public void push(T val){
        Entry<T> node = new Entry<>(val, bottom.next);
        bottom.next = node;
        count++;
    }

    // 出栈,并把出栈元素的值返回
    public T pop(){
        if(empty())
            return null;
        T val = bottom.next.data;
        bottom.next = bottom.next.next;
        count--;
        return val;
    }

    // 查看栈顶元素
    public T peek(){
        if(empty())
            return null;
        return bottom.next.data;
    }

    // 判断栈空
    public boolean empty(){
        return bottom.next == null;
    }

    // 返回栈里面元素的个数
    public int size(){
        return this.count;
    }

    /**
     * 链表的节点类型定义
     * @param <T>
     */
    static class Entry<T>{
        T data;
        Entry<T> next;

        public Entry(T data, Entry<T> next) {
            this.data = data;
            this.next = next;
        }
    }
}

public class LinkStackTest {
    public static void main(String[] args) {
        LinkStack<Integer> ls = new LinkStack<>();
        ls.push(23);
        ls.push(21);
        ls.push(56);
        ls.push(84);
        while(!ls.empty()){
            System.out.print(ls.pop() + " ");
        }
        System.out.println();
    }
}

链式队列

/**
 * 链式队列
 * front:指向的是链表的头节点
 * rear:永远指向的是末尾节点
 * @param <T>
 */
class LinkQueue<T> {
    // 构造函数  offer  poll  peek   empty   size
    private Entry<T> front;
    private Entry<T> rear;
    private int count=0;
    public LinkQueue() {
        Entry<T> node=new Entry<>(null,null);
        node.next=null;
        front=rear=node;
    }

    public void offer(T val) {
        Entry<T> node = new Entry<>(val, null);
        rear.next=node;
        rear= node;
        count++;
    }

    public T poll() {
        T val = null;
        if(this.front.next != null){
            val = this.front.next.data;
            this.front.next = this.front.next.next;
            // 删除队列最后一个元素,要把rear指向front,队列才能判空
            if(this.front.next == null){
                this.rear = this.front;
            }
            this.count--;
        }
        return val;
    }

    public T peek() {
        if (empty()) {
            return null;
        }
            return front.next.data;
    }

    public boolean empty() {
        return front==rear;
    }
    public int size(){
     return this.count;
    }

    public static class Entry<T> {
        T data;
        Entry<T> next;

        public Entry(T data, Entry<T> next) {
            this.data = data;
            this.next = next;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值