zoukankan      html  css  js  c++  java
  • 栈的应用---编译器左右符号的语法匹配

            各位程序员在写代码的时候,使用的编译器(如VisualStudio、Eclipse)都有左右括号的自己主动匹配功能,假设写错了,它就会即时编译,提示错误。

    那么如今。就利用栈的特点就简单实现了这一功能。

    能够实现基本‘ { ’、‘ [ ’、‘(’、‘ “ ’、‘ ‘ ’、’ < ‘的左右匹配功能。

    基本实现思路:

    1,将代码视为一条字符串。创建栈空间

    2,遍历字符串。遇到左符号->压栈

    3,遇到右符号。弹栈,弹出的左符号与右进行匹配

    4,运行步骤2 。直到遍历到''(字符串结尾)


    详细代码例如以下:

    因为使用到了栈的代码。这里就不再次贴上栈的代码了,请參阅:栈的实现与操作(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] != '') { 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! ", code[i]); ret = 0; break; } }//end 2 if i++; }//end while if ((LinkStack_Size(stack) == 0) && (code[i] == '')) //假设栈为空。且遍历到字符结尾。匹配成功 { 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! ");} "; matcher(code); printf(" "); system("pause"); return 0; }


    执行结果:

    Success!
    请按随意键继续. . .
    
    


    如有错误。望不吝指出。

  • 相关阅读:
    Android在onCreate()中获得控件尺寸
    Java根据出生年月日获取到当前日期的年月日
    Oracle 取随机数
    filter,orderBy等过滤器
    ng-repeat 指令
    三元表达式、逻辑表达式 与 &&、||的妙用
    ng-switch 指令
    sublime text 3.0 安装 HTML-CSS-JS Prettify
    JS相关环境搭建:Nodejs、karma测试框架、jsDuck、Express
    关于VSS上的项目源码管理的注意问题
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6814131.html
Copyright © 2011-2022 走看看