zoukankan      html  css  js  c++  java
  • 堆栈应用:匹配文本符号({ }、[ ]、())----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,'', 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
    ");
            exit(-1);
        }
        
        pFILE = fopen(argv[1], "r");
        if(pFILE == NULL)
        {
            perror("open");
            exit(-1);
        }
        
        if((pStack = Stack_Init(10)) == NULL)
            printf("malloc failer
    ");
        
        sData.line = 1;
        sData.column = 0;
        sData.ch = -1;
        while(feof(pFILE) == 0)
        {
            sData.ch = fgetc(pFILE);
            if(sData.ch == '
    ')
            {
                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
    ", sData.line, sData.column);
                }
            }
        }
        while(Stack_Empty(pStack) == -1)
        {    
            Stack_POP(pStack, &sData);
            printf("line: %d,   column: %d unmact
    ", sData.line, sData.column);
        }
    
        exit(0);
    }
  • 相关阅读:
    显示当前时间和全班学生成绩求和
    js做计算器
    javascript学习内容--改变样式、取消设置、显示内容、隐藏内容
    javascript学习内容--object.style.display="value" value值为“”none“隐藏”或 "block"显示
    元素示例
    Python网页爬虫(一)
    macbook Android开发环境搭建,真机调试
    Shell 脚本编程笔记(一) Hello Shell
    嵌入式开发(一) Ubuntu12.04下搭建交叉编译环境
    算法学习(二) 全排列问题的非递归算法——模拟堆栈
  • 原文地址:https://www.cnblogs.com/MrRS/p/9032153.html
Copyright © 2011-2022 走看看