堆栈应用:匹配文本符号({ }、[ ]、())----2018.5.13
#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); }