Java数据结构-栈

栈(Stack)是一种特殊的线性表,只能在一端进行操作,往栈中添加元素的操作,叫做push,入栈.

从栈中移除元素,叫做pop ,出栈,只能移除栈顶元素也叫做弹出栈顶元素.后进先出的原则.

 


栈的简单实现

这里运用java中的ArrayList简单实现了栈的结构

public class Stack<E> extends ArrayList<E> {



    public void push(E element){
        add(element);
    }
    public E pop(){

        return remove(size()-1);
    }
    public E top(){
        return get(size()-1);
    }
}

练习题:

  1. https://leetcode-cn.com/problems/valid-parentheses/
  2. https://leetcode-cn.com/problems/score-of-parentheses/comments/

    题1:

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

                stack.push(c);
            }else {//右括号
                if (stack.isEmpty()) return false;
                char left = stack.pop();
                if (left=='('&&c!=')') return false;
                if (left=='['&&c!=']') return false;
                if (left=='{'&&c!='}') return false;

            }
        }

        return stack.isEmpty();
    }

题2:

 /**
     * () 得 1 分。
        AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
        (A) 得 2 * A 分,其中 A 是平衡括号字符串。
     * @param s
     * @return
     */
    public int isValid(String s) {
        Stack<Integer> stack = new Stack<>();
        int len = s.length();
        for (int i = 0; i < len; i++) {
            char c = s.charAt(i);
            if (c=='('){
                stack.push(-1);//用-1表示左括号;
            }else{
                if (c==')'){//遇到右括号
                    Integer peek = stack.peek();//获取栈顶元素
                    if (peek==-1){
                        //直接合并为1   左括号(-1)出栈
                        stack.pop();
                        stack.push(1);//入栈 表示合并完成的A
                    }else{//不为-1  表示有嵌套  (A) 得 2 * A 分 所以要乘2
                        int t=0;//声明一个临时变量用于存储内部的值
                            while (!stack.isEmpty()){
                                Integer peek1 = stack.peek();
                                stack.pop();
                                if (peek1==-1){//表示遇到了左括号 表示完结了 跳出循环
                                    break;
                                }else{
                                    t+=peek1; //表示遇到的不是左括号 就得把内部的合并好的()相加
                                }
                            }
                        stack.push(t*2);//因为第一次遇到的一定不会是-1  所以t一定不会是0
                    }
                }
            }
        }
        int sum = 0;
        if (!stack.isEmpty()){
            while (!stack.isEmpty()){
                Integer peek = stack.peek();
                sum+=peek;
                stack.pop();

            }
        }
        return sum;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值