代码:
LinkList.h
LinkList.c
LinkStack.h
LinkStack.c
栈-线性表
main.c
#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"
//该程序是检查字符串中的出现一对符号时,有没有出现交叉错误使用
/*
比如: < ( > ) 这种情况检测失败
< > ( ) 这种情况检测成功
< ( ) > 这种情况检测成功
*/
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[2][5]; int (*p)[3]; p = a[0]; printf(\"%d\\n\", &p[2][3] - &a[1][3]); return 0; }";
scanner(code);
getchar();
return 0;
}
分析:
汇编: