栈的应用实践之括号匹配的检测
来源:互联网 发布:营销网络 编辑:程序博客网 时间:2024/05/16 01:40
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, 妙用栈可以获得不可以思议的神奇功效。
- 栈的应用实践之括号匹配的检测
- 栈的应用之括号的匹配
- 栈的应用之括号的匹配
- 栈的应用之括号匹配
- 数据结构栈的应用之括号匹配
- 栈的应用之括号匹配
- 数据结构之 栈的应用 括号匹配
- c栈的应用之括号匹配
- 栈的应用之括号匹配code_legend
- 栈的应用之括号匹配检验
- 栈的应用之括号匹配
- 栈的应用之括号匹配
- 栈的应用之括号匹配
- 栈的应用之括号匹配
- 简单栈的应用之括号匹配
- 【学习点滴-数据结构-栈&队列】 栈的应用之二:括号匹配的检测
- 栈的应用实践——括号匹配的检验
- <数据结构>栈的应用一:括号匹配检测
- 第十七周项目6 读取文件,多文件处理
- JAVA环境配置
- Hibernate 的<generator class="native"></generator>的不同属性含义
- OC-中介找房-代理设计模式
- “Avalon”动画:故事板 (Storyboard) 简介
- 栈的应用实践之括号匹配的检测
- Periodic Strings
- 黑马程序员——Objective-c学习笔记——类(面向对象)——黑马 ios 技术博客
- 深入浅出WPF(7)——数据的绿色通道,Binding(上)
- 读取USB HDD(USB移动硬盘信息)序列号的代码
- TCP/IP、Http、Socket的区别
- 《深入浅出WPF》笔记——绑定篇(一)
- asp.net 邮件发送提醒功能(接收方包括QQ邮箱等)
- poj 1724(优先队列+Dij)