就近匹配
几乎所有编译器都具有检测括号是否匹配的能力
实现编译器中的符号成对检测
eg:检测
#include <stdio.h> int main(){int a[4][4];int (*p)[4];p=a[0];return 0;
算法思路
从第一个字符开始检测
当遇到普通字符时忽略
遇到左符号时压入栈中
遇到右符号时从栈中弹出栈顶符号 并进行匹配
匹配成功 继续读入下一个字符
匹配失败 立即停止 并报错
结束:
成功 :所有字符扫描完毕 且栈为空
结束 : 匹配失败或所有字符扫描完毕但栈非空
总结:当需要检测成对出现但又互不相邻的事物时
可使用栈先进后出的特性
#include <iostream>
#include <stack>
using namespace std;
// 判断左括号
bool isLeft(char c)
{
bool bl;
switch (c)
{
case '[':
case '(':
case '{':
case '<':
bl = true;
break;
default:
bl = false;
break;
}
return bl;
}
bool isRight(char c)
{
bool bl;
switch (c)
{
case ']':
case ')':
case '}':
case '>':
bl = true;
break;
default:
bl = false;
break;
}
return bl;
}
bool match(char left, char right)
{
bool bl;
switch (left)
{
case '[':
bl = right == ']';
break;
case '(':
bl = right == ')';
break;
case '{':
bl = right == '}';
break;
case '<':
bl = right == '>';
break;
default:
bl = false;
break;
}
return bl;
}
void Jiujinpipei(const char* p)
{
int i = 0;
stack<char> st;
while (p[i] != '\0')
{
// 如果是左括号
if (isLeft(p[i]))
{
// 压栈
st.push(p[i]);
}
// 右括号
else if (isRight(p[i]))
{
if (!st.empty())
{
// 栈顶符号
char top = st.top();
// 匹配
if (!match(top, p[i]))
{
cout << "匹配失败!" << endl;
break;
}
st.pop();
}
else
{
cout << "缺少左括号..." << endl;
break;
}
}
i++;
}
if (p[i] == '\0' && st.empty())
{
cout << "匹配成功!" << endl;
}
else
{
cout << "匹配失败!" << endl;
}
}
void main()
{
//
Jiujinpipei("#include <stdio.h> int main() int a[4][4]; int (*p)[4]; p = a[0]; return 0;}");
system("pause");
}