判断字符串中的括号是否匹配

@

1、判断括号是否匹配(只有小括号())

1.1、不成功版,只判断了括号数量是否相等

        题目:给你一个字符串,判断字符串中的括号是否匹配,意思就是一个左括号要对应一个右括号,即'('')'必须成对出现。那不就是判断字符串里面的'('')'数量是不是相等吗,这个简单呀,用stl算法里面的count()函数;开撸

#include<iostream>
#include<string>
#include <algorithm>

using std::endl;
using std::cin;
using std::cout;
using std::string;
using std::count;

int main()
{
    string input;
	getline(cin, input);
	int leftParenthesisNumber = 0, rightParenthesisNumber = 0;
	leftParenthesisNumber = count(input.begin(), input.end(), '(');
	rightParenthesisNumber = count(input.begin(), input.end(), ')');
	if (leftParenthesisNumber == rightParenthesisNumber) {
		cout << "YES" << endl;
	}else {
		cout << "NO" << endl;
	}
	return 0;
}

        然后一看,部分通过。错误用例((1+2)+1))(,enmmm。一看就晓得出啥问题了,左括号和右括号数量是匹配了可是位置不对呀。看来要换种方法了。

1.2、成功版,真正判断了括号是否匹配(位置和数量)

#include<iostream>
#include<string>
#include <algorithm>

using std::endl;
using std::cin;
using std::cout;
using std::string;
using std::count;

int main()
{
    string input;
	getline(cin, input);
	int num=0;
	for (int i = 0; i < input.length(); i++) {
		if (input[i] == '(') {
			num++;
		}else if (input[i] == ')') {
			num--;
		}
		if (num < 0) {                         //num<0 说明出现右括号数量大于左括号了,位置不匹配。直接不合格输出 NO
			cout << "NO" << endl;
			break;
		}
	}
	if (num == 0) {                
		cout << "YES" << endl;
	}else if (num > 0) {                       //num>0 说明出现右括号数量小于左括号了,数量不匹配  输出 NO
		cout << "NO" << endl;
	}
	return 0;
}

         基本思想是从开头往后找,找到一个左括号,括号数加一,找到一个右括号,认为可以对消一对括号,即括号数减一。一旦有括号数小于0,则代表找到这个位置右括号数量大于左括号了,肯定不对了,直接完成搜索。如果找到最后都没有括号数小于0的情况,那么看括号数是多少,为0 说明左右正好对消,满足条件,大于0,说明左括号多了,不满足情况。

2、字符串中有三种括号 ‘(’,’)’,’{’,’}’,’[’,’]’时的判断(利用栈)

         假如括号字符串中有 '(',')','{','}','[',']' 来判断是否是有效括号。左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。

bool isValid(string s) {
        stack<char> myStack;
        for(int i=0;i<s.size();i++){
            if(isLeftParenthesis(s[i])){     //判断这个字符是不是左括号,保证栈里面全是左括号
                myStack.push(s[i]);
            }
            else{                            //到这儿,这个括号已经是右括号了
                if(myStack.empty() || (myStack.top()!=s[i]-1 && myStack.top()!=s[i]-2)){
               /*这个括号已经是右括号了,而且栈里面都空了,那肯定不匹配(因为没有右括号开头的括号嘛)
               那如果栈没空,那么就要判断栈顶的左括号和现在这个右括号是否匹配了
                ‘(’与‘)’ASCII值差1,'['与']ASCII值差2,'{'与'}'ASCII值也差2*/
                    return false;
                }
                myStack.pop();
            }
        }
        return myStack.empty();
    }
    
bool isLeftParenthesis(char c){    //判断是不是左括号
        return (c=='('||c=='['||c=='{');
    }
posted on 2021-06-11 09:36  雾恋过往  阅读(843)  评论(0编辑  收藏  举报

Live2D