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

猜你喜欢

转载自www.cnblogs.com/MrRS/p/9032153.html