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

来源:互联网 发布:淘宝小石头运动 证吗 编辑:程序博客网 时间:2024/05/19 04:54

功能

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

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

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

算法:

       做一个空栈

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

           用变量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,对于空栈它是-1void 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);}elseS->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);}elseS->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 100void 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 100int 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;}