#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;
}
括号匹配
最新推荐文章于 2024-10-09 16:20:31 发布