浅谈栈(Stack)数据结构

一、概述:

栈(stack):栈是一种线性的结构,这种数据结构仅限在线程表的一段进行插入和删除操作。其中线性表插入的和删除的一段称为栈顶(top),不循序插入和删除的一段称为栈底(bottom)。所以栈数据结构是遵循“后入先出”,也就是“LIFO”。

二、栈的特征

(1)栈也是一种线性的机构。

(2)相比较数组,占对应的操作是数组的子集。

(3)只能从一端添加元素,也只能从一端取出元素,这一端称为栈顶。

(4)栈是一种后进先出的数据结构。称为:Liast In First Out(LIFO)

三、栈的应用:

(1)无处不在的Undo操作(撤销)。

(2)程序调用的系统栈。

(3)括号匹配-编译器

通过java.util.Stack来实现一个括号匹配器:

public class Solution {

    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for(int i=0; i< s.length();i++){
            char c = s.charAt(i);
            if(c == '(' || c == '[' || c == '{')
                stack.push(c);
            else{
                if(stack.isEmpty())
                    return false;

                char topChar = stack.pop();
                if(c == ')' && topChar != '(')
                    return false;
                if(c == ']' && topChar != '[')
                    return false;
                if(c == '}' && topChar != '{')
                    return false;
            }
        }
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        System.out.println((new Solution()).isValid("()[]{}"));
        System.out.println((new Solution()).isValid("()[]{]}"));
    }

}

java.util.Stack这个栈数据结构得底层是通过java.util.Vector实现的,Stack继承了Vector,而Vector和ArrayList一样实现了List接口,Vector和ArrayList是实现原理上是非常相似的,它们都是通过数组实现的,不过与ArrayList不同的是,Vector支持线程的同步,即某一个时刻只有一个线程能够操作Vector,避免了多线程同时引起的不一致性,它的同步是通过synchronized实现的,同步需要很高的花费,访问它要比访问ArrayList要慢;Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

四、栈的实现:

(一) 通过自定义ArrayList封装一个栈数据结构:

1、定义Stack接口:

public interface Stack<E> {

    //查看栈元素的数量
    int getSize();

    //查看栈元素是否为空;
    boolean isEmpty();

    //压栈
    void push(E e);

    //弹出
    E pop();

    //查看栈顶元素
    E peek();
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值