• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

华为笔试——C++括号匹配

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

题目:括号匹配

题目来源:https://blog.csdn.net/lizi_stdio/article/details/76618908

题目介绍:输入一个字符串,里面可能包含“()”、“ [  ] ”、" {  } "三种括号,要求程序判断这个字符串里的括号是否成对出现且嵌套关系正确,若成对出现且嵌套关系正确,或字符串中无括号出现时,输出True;否则输出False。无需考虑非法输入。

例:

输入:

(1+4)/[(2+3)*4]

输出:

True

分析:这个问题考察的其实是栈的问题。因为若要成对出现且嵌套关系正确,就必须满足最后的“(”后的下一个括号必须是“)”,否则就不正确,其他两种括号同理。在前面出现的“ [ ”后出现的可能是“(”或者是“ ] ”,因此需要用到栈来解决。若出现左括号则进栈,遇到下一个右括号则与栈中比较,若匹配则出栈进行下一个比对。这样直到末尾,若栈空则输出True,否则输出False即可。

代码:(转载,链接放在文章开头,写的真的很好)

 1 #include <iostream>
 2 #include <cstring>
 3 #include <string>
 4 #include <map>
 5 #include <vector>
 6 #include <algorithm>
 7 using namespace std;
 8 
 9 bool isLeft(char a)
10 {
11     return (a == '(') || (a == '[') || (a == '{');
12 }
13 
14 bool isRight(char a)
15 {
16     return (a == ')') || (a == ']') || (a == '}');
17 }
18 
19 bool isMatch(char a, char b)
20 {
21     if (a == '('&&b == ')')
22     {
23         return true;
24     }
25     else if (a == '['&&b == ']')
26     {
27         return true;
28     }
29     else if (a == '{'&&b == '}')
30     {
31         return true;
32     }
33     return false;
34 }
35 
36 int main()
37 {
38 #if 0
39     freopen("in.txt", "r", stdin);
40     //freopen("out.txt", "w", stdout);
41 #endif
42     string str;
43     vector<char> cvec;
44     cvec.reserve(200);
45     while (cin >> str)
46     {
47         auto iter = str.begin();
48         for (; iter != str.end(); ++iter)
49         {
50             //左括号直接进栈
51             if (isLeft(*iter))
52             {
53                 cvec.push_back(*iter);
54             }
55             //如果出现右括号
56             else if (isRight(*iter))
57             {
58                 //不合理情况1: 栈空的话,直接退出    这里情况一开始忘记考虑,但是华为机试仍然100%通过
59                 if (cvec.empty())
60                 {
61                     break;
62                 }
63                 char c = cvec.back();
64                 cvec.pop_back();
65                 //不合理情况2:判断栈中左括号与现在的右括号是否匹配
66                 if (!isMatch(c, *iter))
67                 {
68                     break;
69                 }
70             }
71         }
72         //处理不合理情况1,2  以及不合理情况3:字符已经遍历结束,但是栈仍然非空
73         if (iter != str.end() || !cvec.empty())
74         {
75             cout << "false" << endl;
76         }
77         else
78         {
79             cout << "true" << endl;
80         }
81     }
82     return 0;
83 }

结果:

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#多线程间的同步问题发布时间:2022-07-14
下一篇:
根据ip地址获得国家和城市(C#)发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap