第五周项目3-括号的匹配
2016-10-08 11:10
218 查看
程序代码:
/* * Copyright (c) 2016,烟台大学计算机学院 * All rights reserved. * 文件名称:ww.cpp * 作者:王译敏 * 完成日期:2016年10月8日 * 版本号:vc6.0 * * 问题描述:假设表达式中允许三种括号:圆括号、方括号和大括号。编写一个算法,判断表达式中的各种左括号是否与右括号匹配 * 输入描述:输入一个式子 * 程序输出:是否匹配 */ #include <stdio.h> #include <malloc.h> #include <string.h> typedef char Elemtype; typedef struct node { int data; struct node *next; } LiStack; void InitStack(LiStack *&l) { l=(LiStack *)malloc(sizeof(LiStack)); l->next=NULL; } void DestroyStack(LiStack *&l) { LiStack *pre=l,*p=l->next; while(p!=NULL) { free(pre); pre=p; p=p->next; } free(pre); } bool StackEmpty(LiStack *l) { return (l->next==NULL); } void Push(LiStack *&l,Elemtype e) { LiStack *p; p=(LiStack *)malloc(sizeof(LiStack)); p->data=e; p->next=l->next; l->next=p; } bool Pop(LiStack *&l,Elemtype &e) { LiStack *p; if(l->next==NULL) return false; p=l->next; e=p->data; l->next=p->next; free(p); return true; } bool GetTop(LiStack *l,Elemtype &e) { if(l->next==NULL) return false; e=l->next->data; return true; } bool match1(Elemtype exp[],int n) { int i=0; char e; bool match=true; LiStack *st; InitStack(st); //初始化栈 while(i<n && match) //扫描exp中的所有字符 { if(exp[i]=='(') //当前字符为左括号,进栈 Push(st,exp[i]); else if(exp[i]==')') //当前字符为右括号 { if(GetTop(st,e)==true)//能够取出栈顶元素 { if(e!='(') //栈顶元素不为'('时表示不匹配 match=false; else //匹配,将栈顶元素出栈 Pop(st,e); } else match=false; //无法取出栈顶元素,表示不匹配 } i++; } if(!StackEmpty(st)) //最后栈不空时,表示不匹配 match=false; DestroyStack(st); //销毁栈 return match; } bool match2(Elemtype exp[],int n) { int i=0; char e; bool match=true; LiStack *st; InitStack(st); //初始化栈 while(i<n && match) //扫描exp中的所有字符 { if(exp[i]=='[') //当前字符为左括号,进栈 Push(st,exp[i]); else if(exp[i]==']') //当前字符为右括号 { if(GetTop(st,e)==true)//能够取出栈顶元素 { if(e!='[') //栈顶元素不为'['时表示不匹配 match=false; else //匹配,将栈顶元素出栈 Pop(st,e); } else match=false; //无法取出栈顶元素,表示不匹配 } i++; } if(!StackEmpty(st)) //最后栈不空时,表示不匹配 match=false; DestroyStack(st); //销毁栈 return match; } bool match3(Elemtype exp[],int n) { int i=0; char e; bool match=true; LiStack *st; InitStack(st); //初始化栈 while(i<n && match) //扫描exp中的所有字符 { if(exp[i]=='{') //当前字符为左括号,进栈 Push(st,exp[i]); else if(exp[i]=='}') //当前字符为右括号 { if(GetTop(st,e)==true)//能够取出栈顶元素 { if(e!='{') //栈顶元素不为'{'时表示不匹配 match=false; else //匹配,将栈顶元素出栈 Pop(st,e); } else match=false; //无法取出栈顶元素,表示不匹配 } i++; } if(!StackEmpty(st)) //最后栈不空时,表示不匹配 match=false; DestroyStack(st); //销毁栈 return match; } int main() { Elemtype a[1000]; int n; while(gets(a)) { n=strlen(a); if(match1(a,n) && match2(a,n) && match3(a,n)) printf("匹配正确!\n"); else printf("匹配错误!\n"); } return 0; } 运行程序:
<img src="http://img.blog.csdn.net/20161008112735475" alt="" />
知识点总结:
链栈的基本运算
学习心得:
加强练习