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!
    请按随意键继续. . .
    
    


    如有错误。望不吝指出。

  • 相关阅读:
    HDU 3081 Marriage Match II
    HDU 4292 Food
    HDU 4322 Candy
    HDU 4183 Pahom on Water
    POJ 1966 Cable TV Network
    HDU 3605 Escape
    HDU 3338 Kakuro Extension
    HDU 3572 Task Schedule
    HDU 3998 Sequence
    Burning Midnight Oil
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6814131.html
Copyright © 2011-2022 走看看