一、括号匹配的四种可能性:
三、大概思路
①左右括号配对次序不正确
②右括号多于左括号
③左括号多于右括号
④左右括号匹配正确
二、测试代码
char a[] = "(())abc{[(])}" ; // 左右括号次序匹配不正确
char
b[] = "(()))abc{[]}"
; //
右括号多于左括号
char c[] =
"(()()abc{[]}"
; //
左括号多于右括号
char d[] =
"(())abc{[]()}"
; //
左右括号匹配正确
1、判单是否是括号
------->不是括号------------>跳转至循环控制条件部分
------->是括号
如果是左括号---->入栈
右括号比较str[i]与栈顶元素(非空)--------->匹配------->出栈
------->不匹配------>括号次序有问题
栈顶为空---------->右括号多
2、比较退出------>栈中为空-------->完全匹配
栈中非空-------->左括号多余右括号
四、程序代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<stack>
#include<assert.h>
using namespace std;
bool IsMatchBrackets(char c)//判断是否为括号
{
if (c == '(' || c == ')' || c == '{' || c == '}'
|| c == '<' || c == '>' || c == '[' || c == ']')
return true;
return false;
}
bool MatchBrackets(char*pStr)
{
assert(pStr);//判断传过来的字符串是否为空
stack<char> s;
size_t len = strlen(pStr);
for (int i = 0; i < len; ++i)
{
if (false ==IsMatchBrackets(pStr[i]))//不是括号的情况
{
continue;
}
else//判断是括号的问题
{
//左括号
if (pStr[i] == '(' || pStr[i] == '{' || pStr[i] == '['
|| pStr[i] == '<')
s.push(pStr[i]);
else//右括号
{
if (s.empty())//判断栈中为空
{
cout << "右括号多余左括号" << endl;
return 0;
}
else//非空
{
if ((pStr[i] == ')'&&s.top() == '(')
|| (pStr[i] =='}'&&s.top() == '{')
||(pStr[i] == ']'&&s.top() == '[')
||(pStr[i] == '>'&&s.top() == '<'))//括号匹配
{
cout << "完全匹配" << endl;
s.pop();
//return true;
}
else//括号不匹配
{
cout << "括号次序有问题" << endl;
return false;
}
}
}
}
}
if (true ==s.empty())
{
cout << "完全匹配" << endl;
return true;
}
else
{
cout << "左括号多于右括号" << endl;
return false;
}
}
int main()
{
char a[] = "(())abc{[(])}"; // 左右括号次序匹配不正确
char b[] = "(()))abc{[]}"; // 右括号多于左括号
char c[] = "(()()abc{[]}"; // 左括号多于右括号
char d[] = "(())abc{[]()}"; // 左右括号匹配正确
MatchBrackets(a);
MatchBrackets(b);
MatchBrackets(c);
MatchBrackets(d);
system("pause");
return 0;
}