栈-实现一个简单的静态栈

栈的简介

        栈是一种先进后出的线性表。栈限制插入和删除只能在一个位置进行,允许插入删除的一端称为栈顶,另一端称为栈底。

        插入数据的操作称为压栈(PUSH),删除数据的操作称为弹栈(POP)。

栈有两种实现方式:通过数组实现(静态栈),通过链表实现(动态栈)。

b849b5392b854b12868a40f781de0571.png

 实现一个静态栈

定义一个栈溢出异常,当栈满时继续压栈抛出

package xyz.syyrjx.stack.exception;

public class MyStackOverflowException extends RuntimeException{
    public MyStackOverflowException() {
    }

    public MyStackOverflowException(String message) {
        super(message);
    }
}

定义一个栈空异常,当栈空时继续弹栈抛出

package xyz.syyrjx.stack.exception;

public class MyStackEmptyException extends RuntimeException{
    public MyStackEmptyException() {
    }

    public MyStackEmptyException(String message) {
        super(message);
    }
}

定义一个简单的静态栈

package xyz.syyrjx.stack;

import xyz.syyrjx.stack.exception.MyStackEmptyException;
import xyz.syyrjx.stack.exception.MyStackOverflowException;

public class MyStaticStack<T> {
    private Object[] array;
    private int size;

    private static final int DEFAULT_INIT_LENGTH = 10;
    private static final String STACK_OVERFLOW_MESSAGE = "栈已满,无法继续存入数据";
    private static final String STACK_EMPTY_MESSAGE = "栈已空,无法继续删除数据";

    public MyStaticStack(int initLength){
        array = new Object[initLength];
    }
    public MyStaticStack(){
        this(DEFAULT_INIT_LENGTH);
    }

    /**
     * 压栈方法
     * @param obj 需要压栈的数据
     */
    public void push(T obj){
        if (size >= array.length){
            throw new MyStackOverflowException(STACK_OVERFLOW_MESSAGE);
        }
        array[size++] = obj;
    }

    /**
     * 弹栈方法
     * @return 弹出栈的元素
     */
    public T pop(){
        if (0 == size){
            throw new MyStackEmptyException(STACK_EMPTY_MESSAGE);
        }
        T res = (T)array[size - 1];
        size--;
        return res;
    }

    /**
     * 获取栈中有效元素的长度
     * @return 有效元素的长度
     */
    public int size(){
        return this.size;
    }

    public static void main(String[] args) {
        MyStaticStack<String> stack = new MyStaticStack<>();
        stack.push("1");
        stack.push("2");
        stack.push("3");
        stack.push("4");
        stack.push("5");
        stack.push("6");
        System.out.println("当前栈的长度" + stack.size());
        System.out.println("弹出栈顶元素" + stack.pop());
        System.out.println("当前栈的长度" + stack.size());
        stack.push("7");
        System.out.println("弹出栈顶元素" + stack.pop());
    }
}

使用刚刚写的静态栈来解决问题

题目:给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。

package xyz.syyrjx.stack;

import java.util.Objects;

public class TestApp {
    /*
        给定字符串只有'('、')'、'['、']'、'{'、'}'
        判断字符串中的括号是不是完整关闭
        如"("、"[[(]"、"]["返回false
        "()"、"[()]"返回true
     */
    public static final char[] BRACKETS_ARRAY = {'(',')','[',']','{','}'};

    /**
     * 检验字符串
     * @param str 需要被检验的字符串
     * @return 匹配返回true,不匹配返回false
     */
    public static boolean check(String str){
        //如果字符串长度为单数,一定不是完整关闭的
        if (0 != str.length() % 2){
            return false;
        }

        MyStaticStack<Character> stack = new MyStaticStack<>(str.length());

        for (int i = 0; i < str.length(); i++){
            char currentChar = str.charAt(i);
            //判断是哪个字符
            int j = 0;
            for (;j < BRACKETS_ARRAY.length; j++){
                if (currentChar == BRACKETS_ARRAY[j]){
                    break;
                }
            }
            //出现了其它字符
            if (j > BRACKETS_ARRAY.length){
                return false;
            }
            switch (j){
                //左括号进栈
                case 0:
                case 2:
                case 4:
                    stack.push(BRACKETS_ARRAY[j]);
                    break;
                //右括号出栈
                case 1:
                case 3:
                case 5:
                    //栈空还需要出栈,右括号多了
                    if (0 == stack.size()){
                        return false;
                    }
                    //本次出栈的左括号不与本次获取到的右括号匹配,则返回false
                    if (!Objects.equals(BRACKETS_ARRAY[j - 1],stack.pop())){
                        return false;
                    }
                    break;
            }
        }
        //如果栈中还有剩余的数据,则左括号多了
        return 0 == stack.size();
    }

    public static void main(String[] args) {
        System.out.println(check("111"));
        System.out.println(check("()[]{}"));
        System.out.println(check("[}"));
        System.out.println(check("[)"));
        System.out.println(check("{(})"));
        System.out.println(check("{[()]}"));
    }
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值