【LeetCode】栈和队列(一)

一、括号匹配问题

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

解题思路:遇到左括号就入栈,如果遇到右括号则取出栈顶元素,看看栈顶元素和当前元素是否匹配,如果字符串遍历完后,同时栈也为空,则为匹配的情况。

完整代码:

class Solution {
   public boolean isValid(String s) {
		//1.创建一个栈
		Stack<Character> stack = new Stack<Character>();
		//2.循环遍历每个字符
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			//3.如果是左括号就入栈
			if(c=='(' || c=='[' || c=='{') {
				stack.push(c);
				continue;
			}
			//4.如果是右括号就取出栈顶元素
			if(stack.isEmpty()) {
				return false;
			}
			char top = stack.pop();
			//5.检查当前元素是否匹配
			if(top == '(' && c == ')') {
				continue;
			}
			if(top == '[' && c == ']') {
				continue;
			}
			if(top == '{' && c == '}') {
				continue;
			}
			//三种情况都不符合则为非法情况
			return false;
		}
		//6.判断栈是否为空
		if(stack.isEmpty()) {
			return true;
		}
		return false;
	}
}

运行结果:

二、最小栈问题

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) -- 将元素 x 推入栈中。pop() -- 删除栈顶的元素。top() -- 获取栈顶元素。getMin() -- 检索栈中的最小元素。

解题思路:核心思路是空间来换时间,用额外空间把最小元素提前保存好,A用来存储栈中的数据,B专门用来存当前栈帧对应的最小元素。先把元素插入到A中,在把当前最小元素存放到B中,如果 B 不为空,当前B的栈顶元素就是之前的最小值,接下来把之前最小值与当前新元素进行对比,确定新的最小值。

注:当线程执行到某个方法时就会往方线程栈中压入一个帧,称为栈帧,栈帧中包含了方法的局部变量表、操作数栈、返回地址、动态连接等信息。

具体代码:

package package3;

import java.util.Stack;

public class MinStack {
    // A 用来表示正常栈中的数据
    // B 用来存储每一层 A栈帧中对应的最小值
    private Stack<Integer> A = new Stack<>();
    private Stack<Integer> B = new Stack<>();

    public void push(int x) {
        // 1. 先把元素插入到A中
        A.push(x);
        // 2. 把当前最小元素插入到B中
        if (B.isEmpty()) {
            B.push(x);
            return;
        }
        // 如果 B 不为空,当前B的栈顶元素就是之前的最小值
        // 之前最小值与当前新元素进行对比,确定新的最小值
        int min = B.peek();
        if (x < min) {
            min = x;
        }
        B.push(min);
    }

    public void pop() {
        if (A.isEmpty()) {
            return;
        }
        A.pop();
        B.pop();
    }

    public int top() {
        return A.peek();
    }

    public int getMin() {
        return B.peek();
    }
}

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值