各位程序员在写代码的时候,使用的编译器(如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! 请按随意键继续. . .
如有错误。望不吝指出。