思路:
从第一个字符开始扫描
当遇见普通字符时忽略
当遇见左符号时压入栈中
当遇见右符号时从栈中弹出栈顶符号,并进行匹配
匹配成功:继续读入下一个字符
匹配失败:立即停止,并报错结束:
成功:所有字符扫描完毕,且栈为空
失败:匹配失败或所有字符扫描完毕但栈非空
Stack_Pare_Match.h
#include "Chain_Stack.h"
bool isLeft(char c);
bool isRight(char c);
int match(char left, char right);
int scanner(const char *code);
.cpp
#include "Stack_Pare_Match.h"
bool isLeft(char c)
{
switch (c)
{
case '<' :
case '(' :
case '[' :
case '{' :
case '\'':
case '\"':
return true;
default:
return false;
}
}
bool isRight(char c)
{
switch (c)
{
case '>':
case ')':
case ']':
case '}':
case '\'':
case '\"':
return true;
default:
return false;
}
}
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)
{
assert(code != NULL);
LinkStack *stack = LinkList_Create();
assert(stack != NULL);
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_Top(stack);
if ((c == NULL) || !match(*c, code[i]))
{
printf("%c does not match!\n", code[i]);
return ERROR;
}
LinkStack_Pop(stack);
}
i++;
}
if (LinkStack_Size(stack) == 0)
{
printf("succed!\n");
}
else
{
while (LinkStack_Size(stack) > 0)
{
printf("%c ", *(char*)LinkStack_Pop(stack));
}
printf("does not match!\n");
}
LinkStack_Destroy(stack);
return OK;
}
int main()
{
const char *code = "#include <stdio.h int main( { int arr[5][5];int (*p)[5];p=arr;}";
scanner(code);
_CrtDumpMemoryLeaks();
system("pause");
return 0;
}