力扣(LeetCode)试题20-有效的括号 C++代码

之前的思路有问题,只考虑到了( ) [ ] { } 、{( [ ] )},两种情况,忽略了 ( ( [ ] ) { } )这种复合情况。

新思路:利用栈数据结构解决该问题。又学到了新东西,嘿嘿

特殊情况:若字符串为空,返回true;若字符串为单数,返回false;若第一个字符为右括号,返回false!

算法:遍历字符串,遇到左括号,将其压入站内

遇到右括号, 取栈顶数据与之匹配:若成功,弹出栈顶数据继续判断下个字符,否则返回false

代码如下:

 1 #include <iostream>
 2 #include <string>
 3 #include <stack>
 4 
 5 using namespace std;
 6 
 7 class Solution
 8 {
 9 public:
10     bool isValid(string s)
11     {
12         int val = s.length();
13         if (val == 0) return true;
14         else
15             if (val % 2 != 0) return false;//个数为奇数必为false
16             else
17             {
18                 if (s[0] == ')' || s[0] == ']' || s[0] == '}')//若第一个字符为右括号,必为false
19                     return false;
20                 else
21                 {
22                     stack<char> space;//创建栈空间,遇到左括号,压栈;遇到右括号,将栈顶弹出与之比较。
23 
24                     for (int i = 0; i < val; i++)
25                     {
26                         if (s[i] == '(' || s[i] == '[' || s[i] == '{')
27                         {
28                             space.push(s[i]);
29                             continue;
30                         }
31                         else
32                         {
33                             
34
35 char temp; 36 temp = space.top();//将栈顶的值赋值给temp 37 //由于栈里均为左括号,这里使用了比较笨的方法,将其转换为右括号,再与s[i]比较 38 //可以写一个函数,实现 39 if (temp == '(') 40 temp = ')'; 41 if (temp == '[') 42 temp = ']'; 43 if (temp == '{') 44 temp = '}'; 45 46 if (temp != s[i])//若栈顶数据与s[i]不匹配,则返回false,否则,弹出栈顶数据并继续循环 47 { 48 return false; 49 break; 50 } 51 else 52 { 53 space.pop(); 54 continue; 55 } 56 57 } 58 } 59 if (space.empty())//所有循环结束,如栈为空,则表示一一匹配成功,返回true 60 return true; 61 else return false; 62 } 63 } 64 } 65 }; 66 67 int main(){ 68 bool result; 69 Solution sol; 70 string str = "(([]){})"; 71 result = sol.isValid(str); 72 cout << result << endl; 73 int y; 74 cin >> y; 75 return 0; 76 }

原文地址:https://www.cnblogs.com/pgzhanglin/p/13218456.html