功能:
此程序的功能检验代码中的每一个右花括号、右方括号及右圆括号与对应的左括号是否成对出现。
如:序列"[()]"是合法的,但"[(])"是错误的。
并报告出错误出现在那一行。
算法:
做一个空栈
读出文件中的每一行,直到文件尾。
用变量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; }