假设一个Cpp中包括圆括号(),方括号[],花括号{}三种类型,编写程序判断该Cpp中的括号是否配对

粗略写了一个程序,存在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

猜你喜欢

转载自blog.csdn.net/JxufeCarol/article/details/82990498