应用1:就近匹配
几乎所有的编译器都具有检测括号是否匹配的能力
如何实现编译器中的符号成对检测?
char *p = "#include <stdio.h> int main() { int a[4][4]; int (*p)[4]; p = a[0]; return 0";
算法思路:
1.从第一个字符开始扫描
若遇见普通字符时忽略,
若遇见左符号时压入栈中
若遇见右符号时从栈中弹出栈顶符号,并进行匹配
2.匹配成功:继续读入下一个字符
匹配失败:立即停止,并报错
3.结束:
成功: 所有字符扫描完毕,且栈为空
失败:匹配失败或所有字符扫描完毕但栈非空
应用场景:
当需要检测成对出现但又互不相邻的事物时,可以使用栈“后进先出”的特性
栈非常适合于需要“就近匹配”的场合。
几乎所有的编译器都具有检测括号是否匹配的能力
如何实现编译器中的符号成对检测?
char *p = "#include <stdio.h> int main() { int a[4][4]; int (*p)[4]; p = a[0]; return 0";
算法思路:
1.从第一个字符开始扫描
若遇见普通字符时忽略,
若遇见左符号时压入栈中
若遇见右符号时从栈中弹出栈顶符号,并进行匹配
2.匹配成功:继续读入下一个字符
匹配失败:立即停止,并报错
3.结束:
成功: 所有字符扫描完毕,且栈为空
失败:匹配失败或所有字符扫描完毕但栈非空
应用场景:
当需要检测成对出现但又互不相邻的事物时,可以使用栈“后进先出”的特性
栈非常适合于需要“就近匹配”的场合。
计算机的本质工作就是做数学运算,那计算机可以读入字符串“9 + (3 - 1) * 5 + 8 / 2”并计算值吗?
实现代码:
借助于我们实现的栈模型,添加如下代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
#include "linkstack.h"
#include "linklist.h"
int isLeft(char c)
{
int ret = 0;
switch (c)
{
case '<':
case '(':
case '{':
case '[':
case '\'':
case '\"':
ret = 1;
break;
default:
ret = 0;
}
return ret;
}
int isRight(char c)
{
int ret = 0;
switch (c)
{
case '>':
case ')':
case ']':
case '}':
case '\'':
case '\"':
ret = 1;
break;
default:
ret = 0;
}
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;
}
return ret;
}
int Scanner(const char *code)
{
int i = 0,ret = 0;
LinkStack*stack = NULL;
//char *p;
stack = LinkStack_Create();
if (stack ==NULL)
{
ret = -1;
return ret;
}
//扫描字符串
while (code[i]!='\0')
{
//判断是否左括号
if (isLeft(code[i]))
{
//碰到左括号入栈
LinkStack_Push(stack,(void*)(&code[i]));
//p = (char*)LinkStack_Top(stack);
//printf("p:%c\n",*p);
}
//判断是否右括号
if (isRight(code[i]))
{
//碰到右括号 出栈(左符号) 看是否匹配
char* c = (char*)LinkStack_Pop(stack);
if (c==NULL||!match(*c,code[i]))
{
printf("%c and %c does not match! \n",*c,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()
{
const char *code = "#include <stdio.h> int main() { int a[4][4]; int (*p)[4]; p = a[0]; return 0;";
Scanner(code);
system("pause");
return 0;
}