栈————有效的括号

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

示例 4:

输入: "([)]"
输出: false

示例 5:

输入: "{[]}"
输出: true

核心思想: 利用栈的性质,先进后出,遇到左括号则压入栈,遇到右括号则与栈顶元素匹配,若匹配成功则将栈顶元素弹出,反之返回false。

匹配方法: 利用map建立哈希表,实现括号一一对应关系。

代码:

 1 #include <iostream>
 2 #include <stack>
 3 #include <string>
 4 #include <map>
 5 using namespace std;
 6 class Solution {
 7 public:
 8     bool isValid(string s) {
 9         if(s.length()%2!=0) return false;//一但是奇数说明不是有效的括号
10         map<char,char> wordbook;//建立哈希表
11         wordbook.insert(map<char,char>::value_type('(',')'));
12         wordbook.insert(map<char,char>::value_type('[',']'));
13         wordbook.insert(map<char,char>::value_type('{','}'));
14         stack<char> mystack;//建立栈
15         for(int i=0;i<s.length();i++)
16         {
17             if(s[i]=='['||s[i]=='{'||s[i]=='(')//匹配到左括号
18                 mystack.push(s[i]);//放入栈中
19             else if(s[i]==']'||s[i]=='}'||s[i]==')')//匹配到右括号
20             {
21                 if(mystack.empty()) return false;
22                 //匹配到右括号,栈中应该存在左括号。否则就是无效的括号
23                 if(wordbook[mystack.top()]==s[i])//与栈顶元素进行匹配
24                 {
25                     mystack.pop();//匹配成功删除栈顶元素
26                     continue;
27                 }
28                 else return false;
29             }
30         }
31         if(mystack.empty()) return true;//有效的括号到最后检测结束栈中应没有元素
32         else return false;
33     }
34 };

 

posted @ 2019-06-03 15:14  Austin_anheqiao  阅读(231)  评论(0编辑  收藏  举报