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

题目:括号匹配

题目来源: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 }

结果:

原文地址:https://www.cnblogs.com/ljy1227476113/p/9644075.html

时间: 2024-11-13 22:20:12

华为笔试——C++括号匹配的相关文章

华为上机练习题--括号匹配检测

题目: 输入一串字符串,其中有普通的字符与括号组成(包括'('.')'.'[',']'),要求验证括号是否匹配,如果匹配则输出0.否则输出1. Smple input:dfa(sdf)df[dfds(dfd)]    Smple outPut:0 分析: 类似于括号字符匹配这类的问题, 我们可以模拟栈的操作来进行验证, 这样问题就简单了, 就是栈的操作 代码如下: package com.wenj.test; import java.util.ArrayList; import java.uti

华为机试—括号匹配判断[去多余括号]

问题描述: 检查字符串表达式中的括号是否匹配: 左括号数目同有括号数目不相等即为不匹配: 去除多余的左括号或者右括号,优先保留先出现的括号: 匹配后去除无效的括号:如:((表达式)) 应为(表达式): 只考虑小括号,不考虑先出现右括号的情况: 要求实现函数: (字符串最长长度为60:表达式正确性不需要考虑) void Bracket(char* src, char* dst); 如果匹配则通过dst输出原串: 如果不匹配则根据要求去除多余括号后通过dst输出匹配后的串: 示例: 输入:12+(3

华为机试—括号匹配

输入一串字符串,其中有普通的字符与括号组成(包括'('.')'.'[',']'),要求验证括号是否匹配,如果匹配则输出0.否则输出1. Smpleinput:  dfa(sdf)df[dfds(dfd)] SmpleoutPut:0 #include <stdio.h> int main() { char a[100],c,i=0; int flag; scanf("%c",&c); while(c!='\n') { flag=0; switch(c){ case(

华为OJ:2199 判断输入字符串中的括号匹配

根据不同的括号有个计数器,在遍历时,当计数器小于0则返回false或者当遍历完后,计数器仍旧不为零,也返回false. import java.util.Scanner; public class bracketsMatch { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); int a=0; int b=0; int c=0; for

新华三:括号匹配

题目: 有表达式:(x+y)*(x-y),验证是否括号匹配,如果括号匹配请输出其括号嵌套深度 Java: 1 import java.util.Scanner; 2 import java.util.Stack; 3 4 public class Main { 5 6 public static void main(String[] args) { 7 Scanner sc=new Scanner(System.in); 8 while(sc.hasNext()){ 9 String s = s

nyoj 括号匹配

这个方程有两种形式,本文采用 if(s[i]=s[j]) dp[i][j]=d[i-1][j-1] dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=<k<j) 其实与另一种方法比较:根据j的所有匹配情况取最小值 1.i到j无匹配,取为dp[i][j-1]+1 2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j] 取上述所有情况最小值 两者都能获得正确的结果. 同时两者的初始化为 dp[i][j]==1 if(i==j) 规划方向为:  

括号匹配问题(顺序栈实现)

本周老师作业留了两个.先上传一个吧.那个有时间我再传上来~ 本周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素和判空操作 括号匹配问题 3.编写主函数实现基本操作函数功能,并设置测试数据,测试合法和非法数据的输出结果. 4.程序调试运行并保存输出结果. 5.整理并提交实验作业. 1 #include <cstdio> 2 #include <cstring>

堆栈_括号匹配

class Solution { public: bool isValid(string s) { if(s.empty()) return false; stack<int> s1; int n=s.size(); for(int i=0;i<n;i++) { if(s[i]=='('||s[i]=='['||s[i]=='{') s1.push(s[i]); else if(s1.empty()) return false; else if((s[i]==')'&&s

括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不