开门见山,假设我们有一大串的由'{', '}', '[', ']', '(', ')' 这些括号构成比如像这样的"{[}][()"符号串,我们肉眼当然能看出它是非法的,那么如何使用代码来判断是否合法呢?

其实我们可以借助栈来判断这些符号串是否非法 :

1.首先我们我需要建立符号的一对一映射,如下所示:

  map<char, char> mp = {{')', '('}, {'}', '{'}, {']', '['}}; // 映射括号

2.我们对字符串进行遍历

1.如果能通过映射的键找到当前字符str[i],我们就从栈顶弹出一个元素并获取该元素。当然,如果是栈为空的清空的话,我们就为这个字符随便赋个值,比如说赋值为 '@',我们假记该变量为top_element。接下来我们看看是否能从当前字符str[i]映射所对应的值与top_element是否相同,若不同,则可以判断该符号串为非法的。

2.若果找不到该字符str[i]映射的键,则先将其加入栈中。

3. 循环结束 ,若栈为空则表示当前字符串合法,若不为空,则表示当前字符串非法

4. 可能光用语言描述不能只管表达,下面我们来看图示,假设我们输入了"()"字符串,其具体过程如下:

5. 好了看完图,接下来我们C++的代码来描述一下该过程:

#include <iostream>
#include <stack>
#include <string>
#include <map>
using namespace std; class Solution
{
public:
bool isValid(string s)
{
if (s == "") // 如果时空字符串也合法
return true;
if (s.size() == ) // 只有一个字符肯定非法
return false;
stack<char> st;
map<char, char> mp = {{')', '('}, {'}', '{'}, {']', '['}}; // 映射括号
for (int i = ; i < s.size(); i++)
{
if (mp.find(s[i]) != mp.end()) // 查找mp是否映射了该符号
{
char top_ele = (st.size() == ) ? '#' : st.top(); // 获取栈顶元素,若为空则随便设置一个字符
if (top_ele != '#') // 栈不为空则弹出元素
st.pop();
if (top_ele != mp.find(s[i])->second) // 如果这个元素被弹出的元素和mp对应映射的值不一样,则直接返回false
return false;
}
else
{
st.push(s[i]); //压入栈中
}
}
return st.size() == ; // 如果栈为空则表示合法
}
};

6. 注意代码中map是直接用list初始化的,所以这段代码必须在c++11下上的版本中才可以运行。

好了以上就是这次分享的全部内容了,如有错误还望斧正,我们下次见。

判断括号是否有效(c++描述)的更多相关文章

  1. 判断括号匹配(nyoj2水)

    括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在,有一行括号序列,请你检查这行括号是否配对.   输入 第一行输入一个数N(0<N<=1 ...

  2. [Java]利用栈判断括号是否完整配对

    利用栈实现判断字符串中的括号是否都是配对的. 主要算法是依次读取字符串中的每一个字符,如果是左括号则将左括号压入栈中,如果是右括号则从栈中弹出最上面的字符,若两者不是同种括号或栈内已经没有字符就返回f ...

  3. 判断括号字符串是否为合法+求n对括号的所有组合

    n对括号的有效组合数 参考:https://zh.wikipedia.org/wiki/%E5%8D%A1%E5%A1%94%E5%85%B0%E6%95%B0 import java.util.Ar ...

  4. PHP 判断括号是否闭合

    一开始的思路就是判断每种括号的开闭数量是否相等,其实虽然也能实现但是搞得太复杂了: 后来查了查,只需设一个常量,左括号  +1,右括号   -1,闭合的话为0,没闭合的话不为0, 出现<0即为顺 ...

  5. hdu4915 判断括号匹配

    题意:       问你括号匹配是否唯一,三种字符'(','?',')',问号可以变成任何字符. 思路:       首先我们要学会判断当前串是否成立?怎么判断?我的方法是跑两遍,开三个变变量 s1 ...

  6. Python 用栈判断括号匹配

    #!/usr/bin/python # -*- coding: UTF-8 -*- from pythonds.basic.stack import Stack def parChecker(symb ...

  7. SHELL的判断括号区别

    在使用if语句时,经常会使用().(()).[].[[]].{}等括号,如下为几种括号简单区别对比: ( ) 用于多个命令组.命令替换.初始化数组: (( )) 整数扩展.运算符.重定义变量值,算术运 ...

  8. java实现的判断括号是否成对的代码,()[]{}都可以

    本来想找找现成的,去,都写的好复杂.自己写一个吧.挺有成就感.哈哈 package com.test.jiexi; import java.util.Stack; public class Check ...

  9. [删括号][判断可行性的dp]

    链接:https://ac.nowcoder.com/acm/problem/21303来源:牛客网题目描述 给你一个合法的括号序列s1,每次你可以删除一个"()" 你可以删除0个 ...

随机推荐

  1. python后端面试第七部分:项目部分--长期维护

    ##################    项目部分       ####################### 1,你怎么测试自己的代码的?自测 2,开发使用windows还是Linux,虚拟环境的 ...

  2. HDU-2544-最短路(各种最短路径算法)

    迪杰斯特拉算法--O(n^2) #include"iostream" #include"cstring" #include"cstdio" ...

  3. [LC] 116. Populating Next Right Pointers in Each Node

    You are given a perfect binary tree where all leaves are on the same level, and every parent has two ...

  4. CAD安装未完成,某些产品无法安装的解决方法

    CAD提示安装未完成,某些产品无法安装该怎样解决呢?,一些朋友在win7或者win10系统下安装CAD失败提示CAD安装未完成,某些产品无法安装,也有时候想重新安装CAD的时候会出现本电脑window ...

  5. !!误解--var vm = new vue({}) 与 export default {} 是一回事儿??

    这两者完全不是同一回事.export default {} 是es6的module中的语法, 而var vm = new vue({}) 是创建一个vue实例.引起误解是因为用了webpack开发vu ...

  6. Nginx笔记总结十七:nginx生成缩略图配置(http_image_filter_module)

    编译: ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_realip_module-- ...

  7. python标准库:datetime模块

    原文地址:http://www.bugingcode.com/blog/python_datetime.html datatime 模块题共用一些处理日期,时间和时间间隔的函数.这个模块使用面向对象的 ...

  8. H5 video 标签 详解

    昨天使用H5  video 标签 写了视频播放   本打算参考爱奇艺的代码进行修改  发现 它是动态数据  静态页面需要拆解代码 我情急之下  使用了  video   整理一下笔记   后面有人用 ...

  9. 最新中文版虚拟机VMware Workstation隆重上市

    vmware虚拟机 在虚拟机软件中VMware Workstation算是一款非常强大较稳定的软件了,今天 VMware Workstation 10.0正式发布了,最让人欣喜的是该版本终于有了简体中 ...

  10. iPhone X会成为苹果最短命的旗舰机型吗?

    最近,有媒体报道有凯基证券分析师郭明琪在他的最新报告指出,iPhone X将在今年中结束生产.因为苹果已计划下半年推出新款iPhone,价格也比iPhone X会低并有新功能发布.所以他预计iPhon ...