目录:
- 代码:
- 分析:
- 汇编:
代码:
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;
}
分析:
汇编: