括号匹配

#include<iostream.h>
#include<string.h>
#include<stdio.h>
template<class T>
struct Node
{
 T data;
 Node<T> *next;
};
template <class T>         
class CirQueue            
{
public:
// CirQueue() {front=rear=0;}
 CirQueue(int n);
 void EnQueue(T x);
 T DeQueue();
 bool Empty() {if(front==rear)return 1;else return 0;}
private:
 int QueueSize;
 char *data;
 int front,rear;
};
template<class T>
class LinkStack
{
public:
 LinkStack() {top=NULL;}
 void Push(T x);
 T Pop();
 bool Empty() {if(top==NULL)return 1;else return 0;}
 int Strlen();
private:
 Node<T> *top;
};
CirQueue<int>:: CirQueue(int n)
{
     data=new char[n];
     QueueSize=n;
     front=rear=0;
}
template<class T>
void CirQueue<T>::EnQueue(T x)

      if (front==(rear+1)% QueueSize) throw "上溢";
      rear=(rear+1) % QueueSize;
      data[rear]=x;
}    
template<class T>
T CirQueue<T>::DeQueue()

      if (front==rear) throw "下溢";
      front=(front+1) % QueueSize;
      return data[front];
}
template<class T>
void LinkStack<T>::Push(T x)
{  
    Node<T> *s=new Node<T>;  s->data=x;
         s->next=top;
         top=s;
}
template<class T>
T LinkStack<T>::Pop()
{  
 if (top==NULL)  throw "下溢";
         T x=top->data;
         Node<T> *s=top;top=top->next;delete s;
         return x;
}
template<class T>
int LinkStack<T>::Strlen()
{
 int i=0;Node<T> *p=top;
 for(p;p!=NULL;p=p->next)
  i++;
 return i;
}
int kind(char x)//进行字符分类的函数
{
  switch (x)
  {case '(':
  case '[':
  case '{':return 1;break;
  case ')':
  case ']':
  case '}':return 2;break;
  default:return 0;
  }
}
bool ok(char x,char y) //左右括号匹配判断
{
 if (x=='(' && y==')') return true;
 if (x=='[' && y==']') return true;
 if (x=='{' && y=='}') return true;
 return false;
}
char * match(char *s)  //匹配函数,我改成了返回字符串,这样更直观些
{
   int i;char ch1,ch2;
   LinkStack<char> S; CirQueue<int> Q(50);
 cout<<S.Strlen()<<endl;
   for(i=0;i<S.Strlen();i++)
    if (kind(s[i])>0)
    {  Q.EnQueue(s[i]);cout<<s[i];}
    cout<<endl;
   
   while (!Q.Empty())
   {
     ch1=Q.DeQueue();
  if (kind(ch1)==1) S.Push(ch1);
    else
    {
     if (S.Empty()) return  "右括号失配";
           ch2=S.Pop();
     if(!ok(ch2,ch1))  return "括号失配";
    }
   }
   if(!S.Empty()) return "左括号失配";
 return "串中括号是匹配的!";  
}
void main()
{
   char *st="{f{fgh(g67)}}[7](d6)[h]";//应有多组测试用数据
    cout<<match(st)<<endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值