2021-02-25

leetcode_20.有效的括号Java代码实现(栈的巧妙应用):

 

1.规则:

leetcode--20. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效,有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
输入:s = "()"      输出:true    
输入:s = "()[]{}"  输出:true
输入:s = "(]"      输出:false
输入:s = "([)]"    输出:false
输入:s = "{[]}"    输出:true

2.思路:

  1.  顺序读取字符串,如果读到左括号,就将该位置的字符入栈,如果读取到右括号则出栈(如果一开始就读取到右括号,则视为不合法),
  2. 将读取到的字符和出栈字符进行组合,如果符合(),{},[]则视为合法,否则返回false。
  3. 直到将整个字符串读取完毕,如果此时栈中有元素则代表该字符串不合法,否则即是合法。

3.代码实现(java)

注:此处代码实现涉及到用栈这种数据结构,而栈分为两种,底层以数组实现的称之为顺序栈,底层以链表实现的称之为链式栈。此处用的是链式栈(顺序栈规定了数组大小,故而需要动态扩容)

package 栈的实现;

import java.util.HashMap;
import java.util.Map;

/**
 * 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
 * 有效字符串需满足:
 * 左括号必须用相同类型的右括号闭合。
 * 左括号必须以正确的顺序闭合。
 * @author lidadiao
 *
 */
public class YouXiaoKH {
	//链式栈数据结构
	private class StackShiX_LS {
		//链表顺序结构   定义内部类    方便链式栈使用
		private class LinkNode {
			public String val;
			public LinkNode next;
		}
		//栈中元素的个数
		private int count;
		//栈的大小    链式栈可以不设定栈得大小   因为理论上可以无限大    只要计算机内存足够
		private LinkNode current;

		public StackShiX_LS() {
			super();
			this.count = 0;
		}

		//入栈
		public boolean push(String node){
			try {
				LinkNode newNode = new LinkNode();
				newNode.val = node;
				newNode.next = current;
				count ++;
				current = newNode;
				return true;
			} catch (Exception e) {
				e.printStackTrace();
				return false;
			}
		}

		//出栈
		public String pop(){
			if(count == 0){
				return null;
			}
			count --;
			LinkNode oldNode = current;
			current = current.next;
			return oldNode.val;
		}

		//返回栈中元素的数量
		public int getSize(){
			return count;
		}

	}

    //测试用例
	public static void main(String[] args) {
		System.out.println(new YouXiaoKH().isValid("{[]}"));   //true
	}

	public boolean isValid(String s) {
		int len = s.length();
		if(len <= 0){
			return false;
		}

		//申请一个栈空间      用来存放检入的字符
		StackShiX_LS stackShiX_LS = new StackShiX_LS();
		Map<String,Integer> paramMap = new HashMap<String, Integer>();
		paramMap.put("(", -1);
		paramMap.put("{", -2);
		paramMap.put("[", -3);
		paramMap.put(")", 1);
		paramMap.put("}", 2);
		paramMap.put("]", 3);
		for(int i = 0; i < len; i++){
			String tempStr = s.charAt(i) + "";
			//如果是左括号   那么就进栈  否则就出栈
			if(judgeIsRight(tempStr)){
				String popStr = stackShiX_LS.pop();
				if(popStr == null){
					return false;
				}
				if(paramMap.get(tempStr) + paramMap.get(popStr) != 0){
					return false;
				}
				//if(paramMap.get(te))
			} else {
				stackShiX_LS.push(tempStr);
			}
		}
		//如果遍历完整个数组     栈为空    则代表是合法得括号  
		if(stackShiX_LS.count == 0){
			return true;
		}
		return false;
	}

	/**
	 * 判断是否为右括号
	 * @param tempStr 需要判断的字符
	 * @return 如果是右括号则返回true   否则else
	 */
	private boolean judgeIsRight(String tempStr) {
		if(tempStr.equals(")") || tempStr.equals("}") || tempStr.equals("]")){
			return true;
		}
		return false;
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值