之前在面试的过程中经常会遇到匹配括号的问题,比如下面这类题目:

1.编写一个函数,该函数接收一个算术表达式作为参数,返回括号缺失的位置。

2.3 + 23 / 12 + (3.14 * 0.24

2.实现一个normalize函数,能将特定的字符串转化为特定的结构化数据。

[a[b[c]]]
// 转化为
{ value: 'a', children: { value: 'b', children: { value: 'c' } } }

偷偷告诉你,第2题是阿里的面试题(这也太难了吧!)

之前看到这类的题目也是一脸懵逼,没有半点思路,然后有一天我在《数据结构与算法JavaScript描述》书中了解到通过栈可以用来判断一个表达式中括号是否匹配。

什么是栈?

栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶。

咖啡厅内的一摞盘子是现实世界中常见的栈的例子。只能从最上面取盘子,盘子洗净后,也只能摞在这一摞盘子的最上面。栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构。

对栈的两种主要操作是将一个元素压入栈和将一个元素弹出栈。入栈使用 push() 方法,出栈使用 pop() 方法。图 演示了入栈和出栈的过程。

其实这些概念挺抽象的,慢慢理解吧。

实战

好了,我们先来做一个题,判断回文:回文是指这样一种现象:一个单词、短语或数字,从前往后写和从后往前写都是一样的。

单词“dad”、“racecar”就是回文
数字 1001 也是回文
function isPalindrome(word) {let s = [];for (let i = 0; i < word.length; ++i) {s.push(word[i]); // 入栈}let rword = "";while (s.length() > 0) {rword += s.pop(); // 出栈}if (word == rword) {return true;}else {return false;}
}

栈的特点就是先进后出,把字符添加到数组中的时候是正序,而取出来的时候是倒序,正是因为这种先进后出刚好相反的顺序,就可以判断回文了。

如果数字123,那么入栈是1、2、3,出栈是3、2、1,入栈和出栈得到的结果不一样,那么他们就不是回文。

如果字符dad,那么入栈是d、a、d,出栈是d、a、d,入栈和出栈得到的结果是一样,那么他们就是回文。

现在已经理解的栈的特点了吧。。。

前面有两道题目,第一题判断缺少的括号可以这么写,参考答案:

function demo (str) {let sign = '(){}[]'let map = {'(': ')','{': '}','[': ']'}let s = []for (let i = 0; i < str.length; i++) {if (sign.includes(str[i])) {let val = str[i];switch (val) {case '(':case '[':case '{': s.push(val); break;case ')':let map1 = s.pop();if (map1 !== '(') {return `位置${i}的)不匹配`}break;case ']':let map2 = s.pop();if (map2 !== '[') {return `位置${i}的]不匹配`}break;case '}':let map3 = s.pop();if (map3 !== '{') {return `位置${i}的}不匹配`}break;}}}if (s.length) {return `符号${s.join()}没有闭合`} else {return '符号正确'}
}

我们的括号包括(){}[],然后入栈是左边部分的括号,出栈是右边部分的括号,当两边的括号有对应关系的时候,说明括号匹配是正确的。

然后下面是第二题[a[b[c]]]转换为树结构的答案:

function normalize (str) {let s = [];let list = [];let obj = {}for (let i = 0; i < str.length; i++) {let value = str[i]switch (value) {case '[':s.push(i)break;case ']':let leftIndex = s.pop();list.unshift([leftIndex, i])default:break;}}let [start, end] = list[0]let parent = objfor (let i = 1; i < list.length; i++) {let [a, b] = list[i];let result = str.slice(start + 1, a) + str.slice(b + 1, end);start = a;end = b;parent.value = result;parent.children = {};parent = parent.children;}let [x, y] = list[list.length - 1]parent.value = str.slice(x + 1, y)return obj
}

先匹配了括号在字符串中的位置保存在数组list[ [ 0, 8 ], [ 2, 7 ], [ 4, 6 ] ],然后通过区间的范围可以知道左右两边的内容(0到2和7到8是第一个括号里面的内容,依次类推,注意最后的内容是4到6这个是闭合的关系),然后通过字符串截取的方式可以得到。最后通过对象之前的引用关系转换为树状结构。

关于JS括号匹配的面试题相关推荐

  1. dp括号匹配 网易面试题_面试题:大括号验证

    dp括号匹配 网易面试题 这是较容易的编码任务之一,但是您仍然可以在一些初步的技术筛选中达到目标. 问题看起来像这样: 给定仅包含字符'(' , ')' , '{' , '}' , '['和']'的字 ...

  2. [JS][编程题]括号匹配

    括号匹配 题目来源:牛客网 题目链接:括号匹配 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M 题目描述 给定一个只包含括号的字符串,判断字符串是否有效.其 ...

  3. lisp压盖_华为笔试题--LISP括号匹配 解析及源码实现

    在17年校招中3道题目AC却无缘华为面试,大概是华为和东华互不待见吧!分享一道华为笔试原题,共同进步! ************************************************ ...

  4. python括号匹配o(1)复杂度_Python面试题:使用栈处理括号匹配问题

    括号匹配是栈应用的一个经典问题, 题目 判断一个文本中的括号是否闭合, 如: text = "({[({{abc}})][{1}]})2([]){({[]})}[]", 判断所有括 ...

  5. 利用栈进行程序的括号匹配

    利用栈进行程序的括号匹配 程序代码: /** fanchen.cpp : 定义控制台应用程序的入口点.**/#include "stdafx.h" #include <ios ...

  6. 数据结构括号匹配代码_数据结构中的栈,你知道多少?

    由于栈比较简单,也很容易理解,学过的人都知道一句话就可以描述栈的特性:后进先出.所以这篇文章主要是写如何使用代码来描述栈,当然也是让大家很容易理解的语言.还是先给出这篇文章的大致脉络. 首先,对栈有一 ...

  7. js正则表达式-匹配空格/数字范围/网址/电话等常用表达式

    1.项目需要匹配gh字符,要求gh前面有空格,后面有无空格都可以. 思路如下: \s : 表示 space ,空格 +: 一个或多个 ^: 开始,^\s,以空格开始 $: 结束,\s$,以空格结束 | ...

  8. ## JS正则匹配规则

    ## JS正则匹配规则  **1. 单字符匹配***    1. 常用元字符      x     匹配一个固定的字符       [abc]    匹配 a, b, c 中的任意一个字符    [a ...

  9. c语言括号匹配的检验,检验括号匹配的算法

    用栈实现检验括号匹配的算法没啥具体描述,数据结构的知识,急用,有重赏 思想是 先进栈,获取第一个半边括号,标记一下,继续进栈直到获取到第二个与之匹配的另一外括号,然后出栈,取出内容.就这样.. 数据结 ...

最新文章

  1. Hadoop2.7.0伪分布式安装教程
  2. JSON 基础解释.
  3. SVN中如何创建共享文件夹
  4. strcpy,strncpy,memcpy,memmove
  5. 计算机编程结构类型,运城计算机编程内存的概念与结构类型
  6. [转]另一个SqlParameterCollection 中已包含 SqlParameter[解决方案]
  7. CentOS6中安装、配置、启动GitLab以及遇到的那些坑
  8. 64ubuntu编译32位程序
  9. C++学习第二天(打卡)
  10. 微信开发者工具不显示二维码问题
  11. 反转 鼠标_灵动轻巧也有好体验,电竞鼠标不能仅看“块头”
  12. PJAX,站点加速之翼
  13. 最新可用双端美化版在线音乐播放器网站源码
  14. win10找不到wifi网络_win10找不到realtek高清晰音频管理器的解决放法
  15. java登录清除cookies_退出登录方法,清除相关的cookies和session
  16. 华为手机Root方法(推荐)
  17. Anytime Dynamic A* (AD*)算法分析
  18. .vimrc 错误 E484:打不开syntax.vim E185:Cannot find color scheme
  19. Ubuntu 12.04 软件管理
  20. 新中新a16d二代居民身份证阅读器Python示例

热门文章

  1. 明晚7点,中科院专家带你走进智能计算系统的世界
  2. 克隆一个 AI 替自己开会,爽吗?
  3. 远程办公的破冰行动!
  4. 马云再谈对钱没有兴趣;比尔·盖茨:微软原本可以击败 Android!TypeScript 3.7 发布 | 极客头条...
  5. Google Chrome 正在走 Windows 的老路
  6. 重磅揭晓阿里 AliOS Things 3.0 革命性创新!
  7. NB-IoT 备胎转正的背后,究竟意味着什么?
  8. 性能提升 3 倍的树莓派 4,被爆设计缺陷!
  9. 计算力就是你的核心业务!
  10. 三步学会 Debug 神器,效率提升不少!