各位程序猿在写代码的时候,使用的编译器(如VisualStudio、Eclipse)都有左右括号的自动匹配功能,如果写错了,它就会即时编译,提示错误。
那么现在,就利用栈的特点就简单实现了这一功能。
可以实现基本‘ { ’、‘ [ ’、‘(’、‘ “ ’、‘ ‘ ’、’ < ‘的左右匹配功能。
基本实现思路:
1,将代码视为一条字符串,创建栈空间
2,遍历字符串,遇到左符号->压栈
3,遇到右符号,弹栈,弹出的左符号与右进行匹配
4,执行步骤2 ,直到遍历到'\0'(字符串结尾)
具体代码如下:
由于使用到了栈的代码,这里就不再次贴上栈的代码了,请参阅:栈的实现与操作(C语言实现) 。相关操作均已实现。
// 栈应用语法匹配.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "LinkStack.h"
#include <stdlib.h>
//判断是否为左符号
int isLeft(char ch)
{
int ret = 0;
switch (ch)
{
case '{':
case '(':
case '[':
case '\"':
case '\'':
case '<':
ret = 1;
break;
default:
ret = 0;
break;
}
return ret;
}
//判断是否为右符号
int isRight(char c)
{
int ret = 0;
switch(c)
{
case '>':
case ')':
case ']':
case '}':
case '\'':
case '\"':
ret = 1;
break;
default:
ret = 0;
break;
}
return ret;
}
//匹配左右符号
int match(char left,char right)
{
int ret = 0;
switch (left)
{
case '{':
ret = (right == '}');
break;
case '[':
ret = (right == ']');
break;
case '(':
ret = (right == ')');
break;
case '\"':
ret = (right == '\"');
break;
case '\'':
ret = (right == '\'');
break;
case '<':
ret = (right == '>');
break;
default:
ret = 0;
break;
}
return ret;
}
//匹配算法
int matcher(const char * code)
{
LinkStack * stack = LinkStack_Create();//创建栈
int ret = 0;
int i = 0;
while (code[i] != '\0')
{
if(isLeft(code[i])) //如果为左符号,就压栈
{
LinkStack_Push(stack, (void *)(code+i)) ;
}//end 1 if
if(isRight(code[i]))
{
char * c = (char * )LinkStack_Pop(stack);//为右符号时,弹栈
if ((NULL == c) || !match(*c,code[i])) //判断 匹配,如果遇到不匹配的,跳出循环
{
printf("%c does not match!\n", code[i]);
ret = 0;
break;
}
}//end 2 if
i++;
}//end while
if ((LinkStack_Size(stack) == 0) && (code[i] == '\0')) //如果栈为空,且遍历到字符结尾,匹配成功
{
printf("Success!");
ret = 1;
}
else
{
printf("Invalid code !");
ret = 0;
}
LinkStack_Destroy(stack);
return ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
const char* code = "#include <stdio.h> int main() {printf(\"Hello World!\n\");} ";
matcher(code);
printf("\n");
system("pause");
return 0;
}
运行结果:
Success!
请按任意键继续. . .
如有错误,望不吝指出。