编写一个用栈来检查程序代码是否遗漏括号的程序
来源:互联网 发布:淘宝小石头运动 证吗 编辑:程序博客网 时间: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;}
- 编写一个用栈来检查程序代码是否遗漏括号的程序
- 一个检查原代码括号配对的程序,栈的应用
- 编写一个程序,检查是否一个给定的数字是一个特殊的号码(定义数组版)
- 检查一个算术表达式中的括号是否匹配
- 假设一个数学算法中包括圆括号(),方括号[],花括号{}三种类型,编写表达式的括号是否配对
- 利用栈的基本操作,检查括号是否匹配
- 括号配对:假设一个数学算式中包括圆括号"()",方括号”[]"和花括号“{}”三种类型,编写一算法判断表达式的括号是否配对。
- 编写程序检查某一个整数中是否有重复的数字
- C程序括号匹配检查
- 一个简单的检查十个数字中是否有重的小程序
- 检查程序是否驻留内存的办法
- shell练习之检查一个程序是否运行并给出提示的方法
- 在Linux下编写C程序,怎么检查程序是否有内存泄漏?
- 编写一个正则表达式:检查一个句子是否以大写字母开头,以句号结尾.
- 验证花括号是否正确出现的c程序源代码
- 数据结构与算法学习之路:检查表达式的括号是否匹配——栈
- new一个对象时加是否加括号的问题
- 用C语言编写程序,判断输入的一个字符串是否是回数
- 摄像头驱动程序的移植前期准备和基本框架
- 两个字符串比较,取出重复字符个数。 (原创)
- android发送短信
- C#Setting.settings
- 三大框架学习心得
- 编写一个用栈来检查程序代码是否遗漏括号的程序
- 重复数据删除行之有效
- 去掉字母A-Z以及数字0-9以外的其他字符函数 (原创)
- Indirect Computing Model with Indirect Formal Method
- 嵌入式linux 自动挂载U盘
- flash用XML与java通信
- XFire实现身份验证(基于Xfire SOAP Header的WebService安全验证)
- 我眼中的敏捷实践
- 3,2011.9.1,物料主界面