#include<stdio.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 isMatch(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:
break;
}
return ret;
}
void printErr(char right)
{
switch (right)
{
case '>':
printf("缺少一个<\n");
break;
case ')':
printf("缺少一个(\n");
break;
case ']':
printf("缺少一个[\n");
break;
case '}':
printf("缺少一个{\n");
break;
case '\'':
printf("缺少一个\'\n");
break;
case '\"':
printf("缺少一个\"\n");
break;
default:
break;
}
}
void Scaner(const char *c)
{
LinkStack *stack = LinkStack_Create();
int i = 0;
while (c[i] != '\0')
{
if (isLeft(c[i]))
{
LinkStack_Push(stack, (void *)(c+i));//若是左括号,则入栈
}
if (isRight(c[i]))
{
char *pop = (char *)LinkStack_Pop(stack);//若是右括号则与栈顶括号比较
if (pop == NULL || !isMatch(*pop, c[i]))
{
printErr(c[i]);
break;
}
}
i++;
}
if (LinkStack_Size(stack) == 0 && c[i] == '\0')
{
printf("Success!\n");
}
else
{
printf("invilod code\n");
}
LinkStack_Destroy(stack);
}
void main()
{
//char *c = "void main() char a[6]; while{ if(a[1]==0) printf(\"Success!\\n\");";
const char *c = "([);";
Scaner(c);
}
栈的应用之检测括号合法性
最新推荐文章于 2024-08-15 15:42:00 发布