首页 > 编程语言 >[C++/PTA] 括号匹配

[C++/PTA] 括号匹配

时间:2023-06-14 21:56:02浏览次数:42  
标签:遍历 false C++ 括号 判断 PTA 字符串 匹配

题目要求

给定仅包含()[]{}六种括号的字符串,请你判断该字符串中,括号的匹配是否是合法的,也就是对应括号的数量、嵌套顺序完全正确。

输入格式:
第一行一个整数T(T<=10)
其后T行每行一个字符串只包含[{()}]六种字符(字符串长度2e5以内)

输出格式:
对于每个字符串,匹配输出Yes,否则输出No

输入样例:
2
{()[]}
([)]

输出样例:
Yes
No

解题思路

这是一道典型的栈的应用题。可以遍历给定的字符串,每次遇到左括号时将其入栈,当遇到右括号时判断栈顶元素是否为对应的左括号,若是则弹出栈顶元素继续匹配,否则括号不匹配。如果遍历结束后栈为空,则说明括号匹配成功。

具体细节如下:

1.首先判断字符串长度是否为奇数,如果是奇数则无法匹配,直接返回 false。

2.遍历字符串中的每个字符,如果是左括号则入栈,如果是右括号则判断栈顶元素是否与之匹配,若匹配则弹出栈顶元素,否则返回 false。

3.遍历结束后,如果栈为空,则说明括号匹配成功,返回 true,否则返回 false。

代码

#include <iostream>
#include <stack>
using namespace std;
stack<char> st;  // 使用栈来进行括号匹配
bool isMarch(string str){  // 定义函数,判断给定字符串中的括号是否匹配
    int len = str.size();  // 获取字符串的长度
    if(len%2) return false;  // 首先判断字符串的长度是否为奇数,如果是奇数则无法匹配,直接返回 false
    for(int i=0;i<str.size();i++){  // 遍历字符串中的每个字符
        switch(str[i]){  // 判断当前字符是否为左括号或右括号
            case '(':
            case '[':
            case '{': st.push(str[i]);break;  // 左括号入栈
            case ')':
                if(!st.empty()&&st.top()=='(') st.pop();  // 当遇到右括号时,判断栈顶是否与之匹配,若匹配则弹出栈顶元素,否则返回 false
                else return false;
                break;
            case ']':
                if(!st.empty()&&st.top()=='[') st.pop();
                else return false;
                break;
            case '}':
                if(!st.empty()&&st.top()=='{') st.pop();
                else return false;
                break;
        }
    }
    return true;  // 遍历结束后如果栈为空,则说明括号匹配成功,返回 true,否则返回 false
}
int main(){
    int T;
    string str;
    cin >> T;  // 输入 T,表示后面有 T 个测试数据
    while(T--){
        cin >> str;  // 输入字符串
        cout << ((isMarch(str)) ? "Yes" : "No") << endl;  // 输出结果,如果括号匹配成功则输出 Yes,否则输出 No
    }
    return 0;
}

总结

该题主要考察栈的应用字符串的遍历、判断等基本操作。读者需要熟练使用栈的相关操作,包括压栈、出栈、栈顶元素获取等。

我是秋说,我们下次见。

标签:遍历,false,C++,括号,判断,PTA,字符串,匹配
From: https://www.cnblogs.com/qiushuo/p/17481446.html

相关文章

  • c++的常量折叠
    一,前言有关C++语言的const常量的考察点:肯定是const常量的内存不是分配在read-only的存储区的,const常量的内存分配区是很普通的栈或者全局区域。也就是说const常量只是编译器在编译的时候做检查,根本不存在什么read-only的区域。所以说C++的const常量和常量字符串是不同的,常量字符......
  • [C++/PTA] 办事大厅排队
    题目要求在郑州大学综合办事大厅,每天陆陆续续有很多人来排队办事。现在你能否写程序帮助老师时刻了解当前办理业务的情况。输入格式:第一行一个数字N,表示排队信息或者查询信息条目的数量。以下N行,每行的内容有以下3种情况(1)inname表示名字为name的人员新来到办事大厅,排在......
  • 从C++mutex到futex
    从std::mutex到futex机制我原本出发点是C++std::mutex的实现原理,但是经过一番查阅,发现C++std::mutex是对glibc-nptl库pthread_mutex的封装;而nptl库在用户态完成了futex机制的一部分;最后在以linux为内核的操作系统中,又提供了futex系统调用给glibc-nptl给与底层支撑。因此本文先......
  • C++ 中 Concept-Model 概念模型
    此文档参考自:https://gracicot.github.io/conceptmodel/2017/09/13/concept-model-part1.html,觉得很有趣,就翻译过来了一、Concept-Model:多态的新视角面向对象编程大家都很熟悉,只需实现一个接口Interface。但这种使用经典OOP实现的多态性是侵入性的,即使在真正不需要的地方......
  • C/C++C语言课程设计[2023-06-14]
    C/C++C语言课程设计[2023-06-14]C语言课程设计要求1、每位同学按照指定的题目完成C语言课程设计,题目不能更换,每人1题,独立完成。上课时间同学们进入学习通课程(C语言课程设计)里签到,老师会有讲解检查。2、考核要求成绩组成考核/评价环节分值(或百分比)考核/评价细则平时成绩考勤、......
  • [C++/PTA] 计算正方体、圆柱体的表面积、体积
    题目要求从立方体、圆柱体抽象出一个公共基类Container,定义抽象类Container,模拟实现一个容器类层次结构,在主函数进行多态机制测试。各派生类要求实现基类的所有纯虚函数。抽象类classContainer{protected:staticdoublepi;public:virtualdoublearea()=0;//纯虚函数,计......
  • [C++/PTA] 抽象类Shape
    题目要求请编写一个抽象类Shape,包括两个纯虚函数,分别为计算面积getArea()和计算周长getPerim()。通过Shape类派生出矩形类Rectangle和圆类Circle,并计算各自的面积和周长。测试用例具体要求:输入1表示测试矩形类,之后输入矩形长和宽。输入2表示测试圆类,之后输入圆半径。Shape类定......
  • [C++/PTA] 计算点到直线的距离一一友元函数的应用
    题目要求计算点到直线的距离。首先设计一个点类Point,它有2个私有数据成员x和y,表示点的坐标。另一个类为直线类Line,它有3个私有数据成员a,b和c,表示直线方程ax+by+c=0。这两个类中都说明了一个友元函数dist,用于计算一个点到直线的距离。点(x.y)到直线ax+by+c=0的距离d的计算......
  • [C++/PTA] 队列操作
    题目要求请实现一个MyQueue类,实现出队,入队,求队列长度.实现入队函数voidpush(intx);实现出队函数intpop();实现求队列长度函数intsize();输入格式:每个输入包含1个测试用例。每个测试用例第一行给出一个正整数n(n<=10^6),接下去n行每行一个数字,表示一种操作:1x:......
  • [C++/PTA] 表彰优秀学生(多态)
    题目要求学期结束,班主任决定表彰一批学生,已知该班学生数在6至50人之间,有三类学生:普通生,特招运动员,学科专长生,其中学科专长生不超过5人。主函数根据输入的信息,相应建立GroupA,GroupB,GroupC类对象。GroupA类是普通生,有2门课程的成绩(均为不超过100的非负整数);GroupB类是特招运......