用数组和链表自己写一遍栈,想记住这种思想,队列也是类似的

栈和队列

定义

先进的后出

用数组自己写栈

package cn.edu.nefu.stack;

import java.util.Arrays;

public class stackByList {

    //定义初始数组stack作为我们的栈
    private int [] stack;
    //定义初始下标-1表示栈是空的,top为0的话说明有一个数据,这样就可以用top代表最上面数据的下标
    private int top = -1;

    //定义初始数组的大小
    public stackByList(){
        stack = new int [10];
    }

    //压栈(往栈里面加东西)
    public void push(int val){
        //顶部下标等于栈长度减一说明栈已经满了需要扩容
        if(top==stack.length-1){
            //如果两倍原数组长度超过了整型最大长度就扩容到整型最大长度,否则就扩容到两倍原数组长度
            int newLength =stack.length*2-Integer.MAX_VALUE>0?Integer.MAX_VALUE:stack.length*2;
            //表示复制数组stack到新的长度为newLength的数组
            stack= Arrays.copyOf(stack, newLength);
        }
        //更新栈顶下标
        top++;
        //把下标为栈顶下标的数组元素赋值为val
        stack[top]=val;
    }

    //弹栈(获取并删除数据)
    public int pop(){
        //先获取目前栈顶的数据,然后把栈顶指针移动到上一个,由于下一次加入数据是直接赋值给栈顶指针的下一个
        //会直接覆盖掉栈顶指针后面那个数据,相当于这个数据已经被删掉了
        return stack[top--];
    }
}

用链表自己写栈(以尾插法为例,头插法也可以)

package cn.edu.nefu.stack;


public class StackByLinkedList {
    private class NodeDouble{
        private NodeDouble prev;
        private int data;
        private NodeDouble next;
        public NodeDouble(){}
        public NodeDouble(int data){
            this.data=data;
        }
        public NodeDouble(NodeDouble prev,int data,NodeDouble next){
            this.prev=prev;
            this.data=data;
            this.next=next;
        }
    }
    private NodeDouble head;
    private NodeDouble tail;

    //压栈
    public void push(int data){
        //如果头指针为0说明链表为空,就直接插进去然后把node赋值给head和tail就行
        if(head==null){
            head=new NodeDouble(data);
            tail=head;
            return;
        }
        //链表不为空的话就new一个node,他的prev赋tail也就是前指针指向现在的尾节点
        NodeDouble node=new NodeDouble(tail,data,null);
        //让tail指向node,tail是变量
        tail.next=node;
        //把tail的下一个节点赋给tail也就是更新尾节点
        tail=node;
    }

    //弹栈
    public int pop(){
        //先new一个节点把尾节点赋给他
        NodeDouble node=tail;
        //把node的data值赋给变量data
        int data=node.data;
        //把尾节点下一个指向当前要弹出的node的前一个
        tail.next=node.prev;
        //更新尾节点
        tail=tail.next;
        return data;
    }

    public static void main(String[] args) {
        StackByLinkedList sbll=new StackByLinkedList();
        sbll.push(1);
        sbll.push(2);
        System.out.println(sbll.pop());
        System.out.println(sbll.pop());
    }
}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值