栈初相识

什么是栈

在这里插入图片描述

数据结构中栈的特点是先进者后出,后进者先出,对于在内存中如何存储并没有要求,如果通过数组来实现叫做顺序栈,如果通过链表实现,则叫做链式栈,可以看出上图就是顺序栈.栈只支持两个基本操作:入栈 push()和出栈 pop()。

顺序栈

在这里插入图片描述

因为栈的特点是先进者后出,后进者先出,所以需要一个指针记录最后入栈的数据

public class ArrayStack<E> {
    private E[] items;  // 数组
    private int count;  // 栈中元素个数
    private int n;      //栈的大小

    // 初始化数组,申请一个大小为n的数组空间
    public ArrayStack(int n) {
        this.items = (E[])new Object[n];
        this.n = n;
        this.count = 0;
    }

    // 入栈操作
    public boolean push(E item) {
        // 数组空间不够了,直接返回false,入栈失败。
        if (count == n) return false;
        // 将item放到下标为count的位置,并且count加一
        items[count] = item;
        ++count;
        return true;
    }

    // 出栈操作
    public E pop() {
        // 栈为空,则直接返回null
        if (count == 0) return null;
        // 返回下标为count-1的数组元素,并且栈中元素个数count减一
        E tmp = items[count-1];
        --count;
        return tmp;
    }
}

链表栈

public class LinkStack<E> {
    private Node top = null;
    // 入栈操作
    public void push(E value) {
        Node newNode = new Node(value, null);
        // 判断是否栈空
        if (top == null) {
            top = newNode;
        } else {
            //将后入栈的数据放到头节点
            newNode.next = top;
            top = newNode;
        }
    }
   // 出栈操作
    public Object pop() {
        if (top == null) return -1;
        E value = (E) top.data;
        top = top.next;
        return value;
    }
	// 结点
    private static class Node<E> {
        private E data;
        private Node next;

        public Node(E data, Node next) {
            this.data = data;
            this.next = next;
        }

        public E getData() {
            return data;
        }
    }
}

应用场景

当某些场景只涉及在某端插入和删除数据,且满足先进者后出,后进者先出时,首先要考虑栈结构

括号匹配问题

给定一个只包括 (){}[] 的字符串,判断字符串是否有效。
有效字符串需满足:
1、左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。

示例

输入: “(]”
输出: false

输入: “([)]”
输出: false

输入: “{[]}”
输出: true

可以使用栈进行解决:

  1. 从左到右依次扫描字符串,当扫描到左括号时,则将其压入栈中
  2. 当扫描到右括号时,从栈顶取出一个左括号
  3. 如果遇到不能配对的右括号,或者栈中没有数据,则说明为非法格式
  4. 当所有的括号都扫描完成之后,如果栈为空,则说明合法;否则为非法格式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值