粗略写了一个程序,存在bug:
(1)缺少右括号时只能判断出存在括号不匹配,而不能指出哪一行括号不匹配;
(2)缺少左括号的时候不能判出哪一行缺少左括号,只能判处哪一行右括号缺少能够相匹配的左括号。
sqstack头文件部分
#ifndef CIRCLE_H
#define CIRCLE_H
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR -1
#define true 1
#define false 0
#define overflow -1
#define stack_init_size 20
#define stack_increment 10
typedef int selemtype;
typedef struct
{
selemtype *base;
int top,stacksize;
}sqstack;
int init_stack(sqstack &s)
{
s.base=(selemtype *)malloc(stack_init_size*sizeof(selemtype));
if(!s.base)
exit(overflow);
s.top=0;
s.stacksize=stack_init_size;
return OK;
}
int gettop(sqstack s,selemtype &e)
{
if(!s.top)
return ERROR;
e=s.base[s.top-1];
return OK;
}
int stackempty(sqstack s)
{
return !s.top;
}
int push(sqstack &s,selemtype e)
{
selemtype *newbase;
if(s.top==s.stacksize)
{
newbase=(selemtype*)realloc(s.base,(s.stacksize+stack_increment)*sizeof(selemtype));
if(!newbase)
exit(overflow);
s.base=newbase;
s.stacksize+=stack_increment;
}
s.base[s.top++]=e;
return OK;
}
int pop(sqstack &s,selemtype &e)
{
if(!s.top)
return ERROR;
e=s.base[--s.top];
return OK;
}
#endif
main程序部分
/*October,2018
*栈的应用
*假定已有一个C源程序,请写一个程序判断该程序中三种括号()、{}、[]是否配对.
*注意:1)以下部分的括号无需进行配对:字符串、行注释//、块注释*/ /* ;
2)需要匹配的括号大多会分在两行(即分散在不同行处);
3)最后输出一个文本表明第n行括号不配对.
*/
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include "sqstack.h"
int match(selemtype e,char ch)
{
if(e=='(' && ch==')')//括号()
return 1;
else if(e=='{' && ch=='}')//括号{}
return 1;
else if(e=='[' && ch==']')//括号[]
return 1;
else
return 0;
}
int main()
{
sqstack test;
FILE *fp,*fq;
int len;
int count=1,flag,control=0;
int linezs=0,kuaizs=0,zfc1=0,zfc1Count=0,zfc2=0,zfc2Count=0;
char str[121];//一次性读取的长度
selemtype e;
flag=init_stack(test);//栈初始化
if((fp=fopen("cppTest.cpp","rb"))==NULL)//读取cppTest.cpp文件
{
printf("Error!\n");
exit(0);
}
while(fgets(str,100,fp)!=NULL)
{
printf("%-5d",count);//输出行号[已注意对齐]
count++;
printf("%s",str);
len=strlen(str);
linezs=0;
for(int j=0;j<len;j++)
{
if(str[j]=='/' && str[j+1]=='/')//行注释判断
{
linezs=1;
j++;
break;
}
if(str[j]=='/' && str[j+1]=='*')//块注释判断1
kuaizs=1;
if(str[j]=='*' && str[j+1]=='/')//块注释判断2
kuaizs=0;
if(str[j]==(char)34)//字符串的判断1
{
zfc1=1+(int)pow(-1,zfc1Count);
zfc1Count++;
}
if(str[j]==(char)39)//字符串的判断2
{
zfc2=1+(int)pow(-1,zfc2Count);
zfc2Count++;
}
if(linezs==0 && kuaizs==0 && zfc1==0 && zfc2==0)//四者除外才可进行是否压栈/出栈的判断
{
switch(str[j]){
case '(':
case '{':
case '[':
push(test,str[j]);
//printf("push:%c\n",str[j]);//测试压入的括号
break;
case ')':
case '}':
case ']':
if(stackempty(test))
{
char error1[5]="第";
char error2[30]="行括号匹配不成功!";
if((fq=fopen("bracketError.txt","wt"))==NULL)
{
printf("\n\nError!\n");
exit(0);
} //输出到文件bracketError中
fprintf(fq,"%s",error1);
fprintf(fq,"%d",count-1);
fprintf(fq,"%s",error2);//使用fprintf格式化输入
fclose(fq);
printf("\n\n第%d行括号匹配不成功!\n",count-1);
control=1;
}
else
{
gettop(test,e);
if(match(e,str[j]))
{
flag=pop(test,e);
//printf("pop:%c,cancel:%c\n",e,str[j]);//测试出栈的括号
}
}
break;
case ' ':
default:
break;
}
}
}
memset(str,0,sizeof(str));
}
fclose(fp);
if(stackempty(test) && control==0)
printf("\n\n括号均匹配成功!\n");//栈空则匹配成功
else
printf("\n\n存在括号匹配不成功!\n");
printf("\n");
return 0;
}
友情链接:
https://blog.csdn.net/qaz3171210/article/details/43672341