zoukankan      html  css  js  c++  java
  • 数据结构 栈的应用一(就近匹配)

    //栈的应用--就近匹配
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"LinkStack.h"//引用链表栈动态库
    
    /*
    思路:遍历每个字符,遇到左符号压栈,遇到右符号出栈,比较出栈的符号是否和右符号匹配,遇到普通符号不管
    */
    
    //符号处理
    int ProtectSymbol(char ch, LinkStack *stack){
        char tempc = 0, * tempc2=NULL,*temp3=NULL;
        switch (ch)
        {
        case '<':
        case '(':
        case '[':
        case '{':
            //压栈操作
            //必须malloc内存 不然压栈的就是局部变量   局部变量会被释放的
            temp3 = (char *)malloc(sizeof(char));
            memset(temp3, 0, sizeof(char));
            *temp3 = ch;
            LinkStack_Push(stack, temp3);
            break;
        case '>':
            tempc = '<';
            break;
        case ')':
            tempc = '(';
            break;
        case ']':
            tempc = '[';
            break;
        case '}':
            tempc = '{';
        default:
            break;
        }
        if (tempc!=0)
        {
            //出栈操作
            tempc2 = (char *)LinkStack_Pop(stack);
            if (tempc2 != NULL)
            {
                if (tempc != *tempc2)
                {
                    printf("不匹配的符号是%c
    ", tempc);
                    //释放内存
                    free(tempc2);
                    tempc2 = NULL;
                    return 1;
                }
                //释放内存
                free(tempc2);
                tempc2 = NULL;
            }
        }
        return 0;
    }
    
    //遍历字符串
    void ProtectStr(char *pin, LinkStack *stack){
        if (pin==NULL)
        {
            return;
        }
        char *temp = pin;
        char *temp3 = NULL;
        int ret = 0;
        while (*temp){
            ret = ProtectSymbol(*temp, stack);
            if (ret!=0)
            {
                printf("符号不匹配!
    ");
                return;
            }
            temp++;
        }
        //判断栈中是否还有元素  有证明 符号缺失
        while (LinkStack_Size(stack)){
            //取出栈顶元素
            temp3 = (char *)LinkStack_Pop(stack);
            if (temp3 != NULL)
            {
                printf("符号%c没有匹配
    ", *temp3);
                //释放内存
                free(temp3);
                temp3 = NULL;
            }
        }
    }
    
    void main(){
        char *restr = "#include <stdio.h> int main() { int a[4][4]; int (*p)[4]; p = a[0]; return 0;";
        //char *restr = "<1";
        //准备栈对象
        LinkStack *stack = LinkStack_Create();
        if (stack==NULL)
        {
            return;
        }
        ProtectStr(restr, stack);
        //销毁链表
        LinkStack_Destroy(&stack);
    
        system("pause");
    }

  • 相关阅读:
    VC++ 利用PDB和dump文件定位问题并进行调试
    MFC限制edit控件的字符输入长度
    VC++ 使用CreateProcess创建新进程
    正则表达式验证HTTP地址是否合法
    C++ _access和_waccess的使用方法
    最后一次谈 VirtualBox的安装方法
    解决/var/log下没有messages文件的问题?
    待续未完- 自己写后台内容管理程序的辅助内容
    php中的正则函数:正则匹配,正则替换,正则分割 所有的操作都不会影响原来的字符串.
    未完待续
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5703249.html
Copyright © 2011-2022 走看看