第五周项目3-括号的匹配

来源:互联网 发布:淘宝网店铺招牌图片 编辑:程序博客网 时间:2024/03/28 17:03
/*  copyright (t) 2016,烟台大学计算机学院  *All rights reserved.  *文件名称:1.cpp  *作者:臧新晓  *完成日期:2016年10月9日  *版本号:v1.0  *问题描述:假设表达式中允许三种括号:圆括号、方括号和大括号。编写一个算法,判断表达式中的各种左括号是否与右括号匹配。例如,输入2+(3+4)*[2+{[3]}]-8,输出匹配正确;输入2+(3+4*[2)+{[3]}-8,输出匹配错误。  *输入描述:一串合法的表达式  *程序输出:括号配对结果(匹配正确/匹配错误)  */  


#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;  }  




知识点总结:

        链栈的应用问题



0 0
原创粉丝点击