编写一个用栈来检查程序代码是否遗漏括号的程序

功能

此程序的功能检验代码中的每一个右花括号、右方括号及右圆括号与对应的左括号是否成对出现。

如:序列"[()]"是合法的,但"[(])"是错误的。

并报告出错误出现在那一行。

算法:

       做一个空栈

     读出文件中的每一行,直到文件尾。

           用变量line_count记录行数

                    判断分留下圆括号、主括号和花括号,并忽略出现的任何其它字符

                              如果栈是空栈

                                     如果是左括号

                                             压入栈

                                     else

                                           报错,并报告出错的行数line_count

                     如果是非空栈

                             如果栈顶的括号与现在读到的括号配对

                                          出栈

                   如果读到的括号是左括号

                                 压入栈

                   else

                                报错,不匹配,报告出出错的行号


程序代码:

stack.h

#ifndef STACK_H_
#define STACK_H_

struct StackRecord;
typedef struct StackRecord * STACK;
typedef char ElementType;

struct StackRecord
{
	int Capacity;
	int TopOfStack;
	ElementType * array;
};

int IsEmpty(STACK S);       //判断空栈
int IsFull(STACK S);        //判断满栈 
STACK CreateStack(int MaxElements);     //创建空栈
void DisposeStack(STACK S);             //释放栈
void MakeEmpty(STACK S);                //初始化TopOfStack为-1,对于空栈它是-1
void Push(ElementType X,STACK S);       //入栈
ElementType Top(STACK S);               //返回栈项元素
void Pop(STACK S);                      //出栈
ElementType TopAndPop(STACK S);         //返回栈项元素并压出栈顶
void file(STACK S,char * filename);     //判断括号是否匹配

#endif

#define EmptyTOS (-1)
#define MinStackSize (5)

stack.c

#include <stdio.h>      //fopen()
#include <stdlib.h>     //malloc() exit
#include "stack.h"

STACK CreateStack(int MaxElements)
{
	STACK S;

	if(MaxElements<MinStackSize)
	{
		puts("栈的大小太小");
		exit(1);
	}

	S=(STACK)malloc(sizeof(struct StackRecord));
	if(S==NULL)
	{
		puts("内存不足");
		exit(1);
	}

	S->array=(ElementType *)malloc(sizeof(ElementType)*MaxElements);
	if(S->array==NULL)
	{
		puts("内存不足");
		exit(1);
	}
	S->Capacity=MaxElements;
	MakeEmpty(S);
	
	return S;
}

void DisposeStack(STACK S)
{
	if(S!=NULL)
	{
		free(S->array);
		free(S);
	}
}

int IsEmpty(STACK S)
{
	return S->TopOfStack==EmptyTOS;
}

int IsFull(STACK S)
{
	return S->TopOfStack==S->Capacity;
}

void MakeEmpty(STACK S)
{
	S->TopOfStack=EmptyTOS;
}

void Push(ElementType X,STACK S)
{
	if(IsFull(S))
	{
		puts("栈满了");
		exit(1);
	}
	else
		S->array[++S->TopOfStack]=X;
}

ElementType Top(STACK S)
{
	if(!IsEmpty(S))
		return S->array[S->TopOfStack];
	puts("空栈");
	return 0;
}

void Pop(STACK S)
{
	if(IsEmpty(S))
	{
		puts("空栈");
		exit(1);
	}
	else
		S->TopOfStack--;
}

ElementType TopAndPop(STACK S)
{
	if(!IsEmpty(S))
		return S->array[S->TopOfStack--];
	puts("空栈");
	return 0;
}

str.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stack.h"
#define LEN 100

void file(STACK S,char * filename)
{
	char top,str;
	char line[LEN];
	FILE * fp;
	const char STRING[]="{}()[]";
	int line_count=0;

	if((fp=fopen(filename,"r"))==NULL)
	{
		 puts("文件打不开");
		 exit(1);
	}

	while(fgets(line,LEN,fp))
	{
		++line_count;
		/*
		fputs(line,stdout);
		printf("数组长度为%d\n",strlen(line));
		*/
		for(int i=0;i<strlen(line);i++)
		{
			if(strchr(STRING,line[i]))
			{
				str=line[i];
				if(IsEmpty(S))
				{
					if(str=='(' || str=='[' || str=='{')
						Push(str,S);			
					else
					{
						printf("在第%d行的%c符号没有左括号\n",line_count,str);
                                                fclose(fp);
						return ;
					}
				}
				else
				{
					top=Top(S);
					if(
					( top=='(' && str==')' ) ||
					( top=='{' && str=='}' ) ||
					( top=='[' && str==']' )
					)
						Pop(S);
					else if(
					(top=='(' || top=='[' || top=='{') && 
					(str=='(' || str=='[' || str=='{')
					)
						Push(str,S);
					else
					{
						printf("在第%d行的%c符号与前面的%c符号不匹配\n",line_count,str,top);
                                                fclose(fp);
						return;
					}
				}
			}
		}
	}
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
#define MAX 100

int main(int argc,char * argv[])
{
	STACK stack=NULL;	

	if(argc!=2)
	{
		printf("命令输入不对\n例如:./stack filename\n");
		exit(1);
	}

	//创建栈
	stack=CreateStack(MAX);

	//判断栈是否为空
	if(IsEmpty(stack))
		printf("空栈\n");

	//进栈
	file(stack,argv[1]);

	//出栈
	if(IsEmpty(stack))
		printf("匹配\n");
	else
	{
		puts("不匹配");
		puts("显示栈的数据");
		for(int i=0;i<=stack->TopOfStack;i++)
		{
			printf("%c",stack->array[i]);
		}
		putchar('\n');
	}
       
       //释放栈
       DisposeStack(stack); 

       return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值