代码
#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;
}