#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
typedef char Status; //函数返回结果
typedef struct _member
{
char ch;
int line;
int column;
}Data;
typedef struct _stack
{
int size;
int memb;
Data ptr[]; //数据存储区
}Stack;
/* 初始化一个空栈 */
static Stack * Stack_Init(int _size)
{
Stack *pStack = (Stack *)malloc(sizeof(Stack) + sizeof(Data) * _size);
if(pStack == NULL)
return NULL;
memset(pStack->ptr,'\0', sizeof(Data) * _size);
pStack->size = _size;
pStack->memb = 0;
return pStack;
}
/* 出栈 */
static Status Stack_POP(Stack *_s, Data *_data)
{
if(_s->memb == 0)
return -1;
*_data = _s->ptr[_s->memb];
_s->memb--;
return 0;
}
/* 压栈 */
static Status Stack_PUSH(Stack *_s, const Data *_data)
{
//if(_s->size == _s->memb)
_s->memb++;
_s->ptr[_s->memb] = *_data;
return 0;
}
static Status Stack_Empty(Stack *_s)
{
if(_s->memb == 0)
return 0;
else
return -1;
}
/* 数据处理函数 */
static Status process(Stack *_s, Data *_data)
{
if((_data->ch == '{') || (_data->ch == '[') || (_data->ch == '('))
Stack_PUSH(_s, _data);
else
{
if(((_data->ch == '}') && (_s->ptr[_s->memb].ch == '{')) ||
((_data->ch == ']') && (_s->ptr[_s->memb].ch == '[')) ||
((_data->ch == ')') && (_s->ptr[_s->memb].ch == '(')) )
Stack_POP(_s, _data);
else
return -1;
}
return 0;
}
int main(int argc, char *argv[])
{
FILE *pFILE = NULL;
Stack *pStack = NULL;
Data sData;
int line = 1; //重新定义line与column变量的原因是因为出栈时sData会更新,同时要输出的不匹配的符号的line值也会被更新,因此新建立一个line变量来存储行号
int column = 0;
int res = 0;
if(argc != 2)
{
printf("please enter currect filename\n");
exit(-1);
}
pFILE = fopen(argv[1], "r");
if(pFILE == NULL)
{
perror("open");
exit(-1);
}
if((pStack = Stack_Init(10)) == NULL)
printf("malloc failer\n");
sData.line = 1;
sData.column = 0;
sData.ch = -1;
while(feof(pFILE) == 0)
{
sData.ch = fgetc(pFILE);
if(sData.ch == '\n')
{
line++;
column = 0;
}
else
{
column++;
sData.line = line;
sData.column = column;
if( (sData.ch=='{') || (sData.ch=='[') || (sData.ch=='(') ||
(sData.ch=='}') || (sData.ch==']') || (sData.ch==')') )
{
res = process(pStack, &sData);
if(res == -1)
printf("line: %d, column: %d unmatch\n", sData.line, sData.column);
}
}
}
while(Stack_Empty(pStack) == -1)
{
Stack_POP(pStack, &sData);
printf("line: %d, column: %d unmact\n", sData.line, sData.column);
}
exit(0);
}