Java------用顺序表和链表实现栈

  • 栈的基本操作:入栈、出栈、取栈顶元素------后进先出

一、用顺序表来实现栈的基本操作

实现思路:针对顺序表的尾插(入栈)、尾删(出栈)、根据下标获取元素的操作(取栈顶元素)
该思路的时间复杂度为O(1)
不用头插头删的原因是:效率低,每次头插头删都会把后面所有元素都搬运一遍,时间复杂度为O(N)

//用顺序表来实现栈的基本操作---后进先出
public class MyStack {
     //创建一个顺序表,提前开辟空间
    private int[]arr=new int[100];
    //记录当前顺序表有效长度
    private int size=0;
    //1.入栈(尾插)
    public void push(int val){
        //先考虑特殊情况(顺序表满)
        if(size>=arr.length-1){
            return;
        }
        arr[size]=val;
        size++;
    }
    //2.出栈(尾删)
    public  Integer pop(){
        //先考虑特殊情况
        // 栈为空
        if(size==0){
          return null;
        }
        int ret=arr[size-1];
        size--;
        return ret;
    }
    //3.取栈顶元素
    public  Integer peek(){
        //先考虑特殊情况
        // 栈为空
        if(size==0){
        return null;
        }
        int ret=arr[size-1];
        return ret;
    }

二、用链表来实现栈的基本操作
实现思路:针对链表的头插(入栈)、头删(出栈)、取链表表头元素(取栈顶元素)
该思路的时间复杂度为O(1)
不使用尾插尾插的原因是:虽然也可以高效完成,但是需要额外记录信息,稍微复杂一点

   class Node{
        int val;
        Node next;

        public Node(int val) {
            this.val = val;
        }
    }

//用(不带傀儡结点的)链表来实现栈的基本操作---后进先出
public class MyStack2 {
    private Node head=null;
    //入栈(头插)
    public void push(int val){
        Node newNode=new Node(val);
        //栈空
        if(head==null){
            head=newNode;
            return;
        }
        newNode.next=head;
        head=newNode;

    }

    //出栈(头删)
    public Integer pop(){
        //栈空
        if(head==null){
            return null;
        }
        //栈中只有一个元素
        if(head.next==null){
            int ret=head.val;
            head=null;
            return ret;
        }
        //一般情况
        int ret=head.val;
        head=head.next;
        return ret;
    }

    //取栈顶元素
    public Integer peek(){
        //栈空
        if(head==null){
            return null;
        }
        return head.val;
    }


    public static void main(String[] args) {
        MyStack2 myStack2=new MyStack2();
        myStack2.push(1);
        myStack2.push(2);
        myStack2.push(3);
        myStack2.push(4);
        System.out.println(myStack2.pop());
        System.out.println(myStack2.pop());
        System.out.println(myStack2.pop());
        System.out.println(myStack2.pop());


    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值