【Java数据结构】---List(Stack)

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言Java

欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~

前言

在这里插入图片描述
截至目前在集合框架中,我们学完了List接口下的ArrayList和LinkedList,今天要学的是栈(Stack),数据结构中最让人“开心”的部分,期待一下吧~ ~ ~

栈Stack

栈:一种特殊的线性表其只允许在固定的一端进行插入和删除元素操作。

栈顶 :进行数据插入和删除操作的一端,另一端称为栈底。栈中的数据元素遵守后进先出的原则

在这里插入图片描述

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈。出数据在栈顶

栈的模拟实现

根据Stack的源码,它只有简单的几个方法,并不像之前ArrayList、LinkedList那么多的方法。因此,我们学起来一定会轻松很多。
在这里插入图片描述
首先,实现整个栈,我们要清楚,这个栈要拿数组表示或者链表表示

其实两者都行,只是对于我们初学者来说,数组更好接受,也更容易接收。把栈中的元素以下标的形式体现出来,是不是更好理解了呢?

压栈操作

public void push(int val){
        if(isFull()){
            this.array= Arrays.copyOf(array,2*array.length);
        }
        array[usedSize++]=val;
    }
    public boolean isFull(){
        return usedSize==array.length;
    }

出栈操作

public int pop(){
        if(isEmpty()){
            throw new EmptyStackExpection();
        }
        int val=array[usedSize-1];
        usedSize--;
        return val;
    }
public boolean isEmpty(){
        if(usedSize==0){
            return true;
        }
        return false;
    }

获取栈顶元素

public int peek(){
        if(isEmpty()){
            throw new EmptyStackExpection();
        }
        return array[usedSize-1];
    }

测试代码:

public static void main(String[] args) {
        MyStack stack=new MyStack();
        stack.push(10);
        stack.push(11);
        stack.push(12);
        stack.push(13);
        stack.push(14);

        System.out.println(stack.pop());
        System.out.println(stack.peek());
    }

在这里插入图片描述
使用数组来模拟的栈叫做顺序栈它的入栈、出栈的时间复杂度都是O(1);
那么用链表来模拟的栈称链式栈单链表的可以采用头插法入栈或者尾插法入栈
在这里插入图片描述

在这里插入图片描述
既然单链表可以,那么双向链表当然也是OK的,并且,入栈时,不管是头插法还是尾插法,时间复杂度可以达到O(1)

public static void main(String[] args) {
        LinkedList<Integer> stack=new LinkedList<>();
        stack.push(10);
        stack.push(11);
        stack.push(12);
        stack.push(13);
        stack.push(14);

        System.out.println(stack.pop());
        System.out.println(stack.peek());

    }

所以,LinkedList不仅是链表也可以当做栈来使用。

从下图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的,这个以后再说。

在这里插入图片描述

栈的练习

有效的括号 - - -力扣

public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for(int i=0;i<s.length();i++){
            char ch=s.charAt(i);
            if(ch=='('||ch=='['||ch=='{'){
                stack.push(ch);
            }else{
                if(stack.isEmpty()){
                    return false; 
                }
                //此时开始判断是否匹配
                char ch2=stack.peek();
                if(ch==')'&&ch2=='('||ch==']'&&ch2=='['||ch=='}'&&ch2=='{'){
                    stack.pop();
                }else{
                    return false;
                }
            }
        }
        if(!stack.isEmpty()){
            return false;
        }
        return true;
    }

逆波兰表达式求值

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for(String str : tokens){
            if(!isOperator(str)){
                int x=Integer.parseInt(str);
                stack.push(x);
            }else{
                int val2=stack.pop();
                int val1=stack.pop();
                switch(str){
                    case "+":
                    stack.push(val1+val2);
                    break;
                    case "-":
                    stack.push(val1-val2);
                    break;
                    case "*":
                    stack.push(val1*val2);
                    break;
                    case "/":
                    stack.push(val1/val2);
                    break;
                }
            }
            
        }
        return stack.pop();

    }
    private boolean isOperator(String ch){
        if(ch.equals("+")||ch.equals("-")||ch.equals("*")||ch.equals("/")){
            return true;
        }
        return false;
    }
}

完结

好了,到这里Java语法部分就已经结束了~
如果这个系列博客对你有帮助的话,可以点一个免费的赞并收藏起来哟~
可以点点关注,避免找不到我~ ,我的主页:optimistic_chen
我们下期不见不散~~Java

下期预告: **【Java数据结构】- - -Queue **

评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值