栈的应用实践之括号匹配的检测
2014-12-21 11:10
253 查看
1,算法的思路如下:
2,算法的框架如下:
3,这里我们用到了之前我们写的栈,就不再重复写了,它们是
LinkList.h
LinkList.c
LinkStack.h
LinkStack.c
4,写一个工程,实现这个算法(MatchPro)中的 main.c :
#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int isLeft(char c)
{
int ret = 0;
switch(c)
{
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 scanner(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));
}
if( isRight(code[i]) )
{
char* c = (char*)LinkStack_Pop(stack);
if( (c == NULL) || !match(*c, code[i]) )
{
printf("%c does not match!\n", code[i]);
ret = 0;
break;
}
}
i++;
}
if( (LinkStack_Size(stack) == 0) && (code[i] == '\0') )
{
printf("Succeed!\n");
ret = 1;
}
else
{
printf("Invalid code!\n");
ret = 0;
}
LinkStack_Destroy(stack);
return ret;
}
int main(int argc, char *argv[])
{
const char* code = "#include <stdio.h> int main() { int a[5][5]; int (*p)[4]; p = a[0]; printf(\"%d\\n\", &p[3][3] - &a[3][3]); return 0; }";
scanner(code);
return 0;
}
小结:
1, 当我们需要检测成对出现但又互不相邻的事物时可以使用栈“后进先出”的特性。
2, 栈非常适合需要“就近匹配”的场合。
3, 妙用栈可以获得不可以思议的神奇功效。
2,算法的框架如下:
3,这里我们用到了之前我们写的栈,就不再重复写了,它们是
LinkList.h
LinkList.c
LinkStack.h
LinkStack.c
4,写一个工程,实现这个算法(MatchPro)中的 main.c :
#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int isLeft(char c)
{
int ret = 0;
switch(c)
{
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 scanner(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));
}
if( isRight(code[i]) )
{
char* c = (char*)LinkStack_Pop(stack);
if( (c == NULL) || !match(*c, code[i]) )
{
printf("%c does not match!\n", code[i]);
ret = 0;
break;
}
}
i++;
}
if( (LinkStack_Size(stack) == 0) && (code[i] == '\0') )
{
printf("Succeed!\n");
ret = 1;
}
else
{
printf("Invalid code!\n");
ret = 0;
}
LinkStack_Destroy(stack);
return ret;
}
int main(int argc, char *argv[])
{
const char* code = "#include <stdio.h> int main() { int a[5][5]; int (*p)[4]; p = a[0]; printf(\"%d\\n\", &p[3][3] - &a[3][3]); return 0; }";
scanner(code);
return 0;
}
小结:
1, 当我们需要检测成对出现但又互不相邻的事物时可以使用栈“后进先出”的特性。
2, 栈非常适合需要“就近匹配”的场合。
3, 妙用栈可以获得不可以思议的神奇功效。
相关文章推荐
- c语言:括号匹配检测(栈的应用)
- 栈应用--括号匹配检测
- 数据结构 栈应用(括号匹配检测)
- 栈的应用实践——括号匹配的检验
- 重温数据结构-栈的应用:进制转换,括号匹配检测,行编辑,迷宫求解,求表达式的值
- 【数据结构】栈的应用——检测括号是否匹配
- 【学习点滴-数据结构-栈&队列】 栈的应用之二:括号匹配的检测
- java栈的应用:实现括号匹配检测
- <数据结构>栈的应用一:括号匹配检测
- 栈的应用——括号匹配的检验(C语言)
- 字符串中圆括号的平衡和匹配检测
- Apache Solr3.4应用实践(高亮 拼写检查 匹配相似)
- 检测某一文件括号是否匹配
- 括号匹配检测
- 堆栈应用括号匹配实验
- solr3.4 高亮(highlight),拼写检查(spellCheck),匹配相似(moreLikeThis) 应用实践
- 数据结构应用-----------括号匹配的检验
- 数据结构(C语言)读书笔记6:栈的应用之括号匹配的C代码实现
- stack应用 POJ 2929&3704 括号匹配
- 如何检测使用Qt Creator制作的程序中的括号是否匹配