栈的应用---编译器左右符号的语法匹配

来源:互联网 发布:罚抄神器速写笔淘宝 编辑:程序博客网 时间:2024/05/20 22:40

        各位程序猿在写代码的时候,使用的编译器(如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 ifif(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 ifi++;}//end whileif ((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!请按任意键继续. . .


如有错误,望不吝指出。

1 0