5-栈的应用-就近匹配

代码

#include"myStack.h"
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

//使用了数组形式的栈

/*
((5+6)/2)+(4+7)/3)
这样一串字符串,分辨出括号是不是成对
判断字符,是左括号入栈,右括号出栈
如果是右括号时栈为空,少左括号
如果结束后栈不为空,少右括号
*/

//标记出不成对的括号的位置,p是括号,str是整个字符串
//str也是字符串首字符的地址,p-str即是括号相对开始字符的位置
void myPrintErr(char* p,char* str){
    if(strlen(str)!=0)
        printf("%s\n",str);
    
    int count = p-str;
    for(int i=0;i<count;i++){
        printf(" ");
    }
    printf("^\n"); //标记出括号匹配不上的位置
}

int test0(char* str){
    int flags=0;
    myStackType* st = init_stack();
    //printf("strlen(str)=%d\n",strlen(str));

    char* p=str;
    for(char* p=str; *p != '\0'; p++){  //遍历字符串
        if(*p == '('){
            //printf("push\n");
            push_stack(st,p);
        }else if(*p == ')'){
            if(size_stack(st) <= 0){
                printf("failed,missing left\n");
                myPrintErr(p,str);
                flags++;
                break;
            }else{
                //printf("pop\n");
                pop_stack(st);
            }
        }
        //p++;
    } 
    if(flags==0){
        if(size_stack(st)==0){
            printf("ok\n");
        }else {
            printf("failed,missing right\n");
            //取出栈中的'('字符(指针),打印出来
            while(size_stack(st) != 0){  
                myPrintErr(top_stack(st),str);
                pop_stack(st);
                flags++;
            }  
        }
    }

    destroy_stack(&st);  //销毁
    return flags;
}

int main(){
    int errCount = test0("((5+6()/2)(+(4+7)/3()((((((");
    if(errCount > 0){
        printf("test failed ,err count=%d\n",errCount);
    }
    return 0;
}
posted @ 2022-01-25 20:58  WuYunTaXue  阅读(23)  评论(0编辑  收藏  举报