uva673 - Parentheses Balance

题意:
括号匹配, 按以下规则:
1. 若字符串为空, 则正确.
2. 若 A、B 皆正确, 则 AB 也正确.
3. 若 A 正确, 则 (A) 与 [A] 都正确.
即要求括号与中括号都要匹配.

思路:
使用栈, 如果当前字符与栈顶字符匹配(必须先进去的是左括号,外面的是右括号才算是匹配的):
1. 当前字符为 ')', 栈顶字符为 '('; 
2. 当前字符为 ']', 栈顶字符为 '[';
则将栈顶字符出栈, 否则将当前字符入栈; 直至所有字符都操作完成, 若栈为空, 则整个字符串正确, 否则不正确.

要点:
当 stack 为空时, 调用 top 会返回段错误.

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cctype>
#include<iterator>
#include<assert.h>
#include<stack>
using namespace std;
//判断字符是否为括号的一部分()[]
bool isParenthese(char c){
    return (c == '(') ||
            (c == ')') ||
             (c == '[') ||
              (c == ']') ;
}
//判断两个char是否匹配,如(),[]
//必须是先进去的是左括号,外面的是右括号才算是匹配
bool isMatch(char left, char right){
    return (left == '(' && right == ')') ||
    (left == '[' && right == ']');
}
//判断c与stk的top是否匹配
bool isMatchTop(const stack<char>& stk, char c){
    if(stk.empty()) return false;
    return isMatch(stk.top(), c);
}
//判断一行是否正确,类似后缀表达式运算,用一个栈来存储
//当前字符与栈顶匹配时,就把栈顶出栈,否则把当前字符出栈
bool isCorrect(const string& line)
{
    stack<char> stk;
    for(int i = 0; i <line.size(); i++){
        if(!isParenthese(line[i])) return false;
        if(isMatchTop(stk, line[i])){
            stk.pop();
        }else{
            stk.push(line[i]);
        }
    }
    //若为空,则说明匹配
    return stk.empty();
}
int main()
{
    int numCase;
    cin >> numCase;
    cin.ignore();
    string line;
    while(numCase--) {
        getline(cin, line);
        if(isCorrect(line)){
            cout << "Yes" <<endl;
        }else {
            cout << "No" <<endl;
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值