编译器检查程序的语法错误,比如括号是否成对出现。
基本思想:做一个空栈。读入字符直到文件结尾,如果字符是一个开放符号,将其入栈。如果是一个封闭符号,则当栈空时报错,否则,将元素弹出,如果弹出的符号不是其对应的开放符号,则报错。到了文件尾,如果栈非空则报错。
//堆栈的定义和实现此处忽略
BracketChecker.h
/**从键盘读入字符串**/
void getString(char word[],int size);
/**获取字符数组的实际长度**/
int size(char word[],int length);
/**检查字符串是否通配**/
void checkChar(char word[],int size);
#include "Stack.h"
#define true 1
#define false 0
/************************************************************************/
/*
(1)如果不匹配则程序报错。
(2)栈中没有匹配的左括号或右括号。表现为在字符串中读到了一个右括号,而堆栈已空。
(3)或者栈中存在没有被匹配的分隔符程序也报错,其表现为把所有的字符串都读完了,栈中还留有分隔符。 */
/************************************************************************/
void getString(char word[],int size)
{
fgets(word,size,stdin);
}
void checkChar(char word[],int size)
{
int i;
int bError=false;
int capacity = 10;
//创建堆栈
Stack s = createStack(capacity);
for (i=0; i<size;i++)
{
char c = word[i];
switch(c){
case '(':
case '[':
case '{':
push(s,c);
break;
case ')':
case ']':
case '}':
if (!isEmpty(s))
{
char popc = pop(s);
if ((c==')' && popc!='(') || (c==']' && popc!='[') ||(c=='}' && popc!='{'))
{
//情况(1)
bError = true;
printf("Error:%c,%2d\n",c,i);
}
} else
{
//情况(2),
bError = true;
printf("Error:%c,%2d\n",c,i);
}
break;
}
}
//情况(3)
if (!isEmpty(s))
{
printf("Error miss right\n");
} else if (!bError)
{
printf("此字符串匹配成功\n");
}
}
int size(char word[],int length)
{
int i;
for (i=0;i<length;i++)
{
if (word[i]=='\0')
{
break;
}
}
return i;
}
int main(void){
char word[80];
int length;//实际字符串长度
getString(word,80);
length = size(word,80);
checkChar(word,length);
return -1;
}