题目描述
在一个表达式中含有圆括号或方括号等来表示运算的优先级,将这些括号提取出来就构成了括号序列 例如:表达式[(A+B)*C]-[E-F] 其括号序列为[()][]
合法的括号序列称为匹配序列,不合法的括号序列称为不匹配序列。匹配序列示例:([()]) [] ()[()] ,不匹配序列示例:([()] ] (][()],那么如何判断一个括号序列是否为匹配序列呢?请用栈的结构来进行验证。
分析
抓住栈的特性:先进后出,后进先出。即一边遍历一边判断,将左类型括号如( [ {,进行入栈操作,当遇到右类型括号时,将此与栈顶元素进行匹配判断,这样可以保证对称关系。不过值得一提的是,该算法没有处理好逻辑关系,例如小括号只能在中括号之内,当然题目也没有这层意思,故不予考虑。
下面附C++代码,创建SqStack类,将基本操作写入方法中。C语言写法也类似,即建立struct SqStack。
#include <iostream>
#define MAXSIZE 1000
using namespace std;
template<typename T>
class SqStack{
T *data;
int top;
public:
SqStack();
~SqStack();
bool EmptyStack();
bool Push(T e);
bool Pop(T &e);
};
template<typename T>
SqStack<T>::SqStack(){
data= new T[MAXSIZE];
top=-1;
}
template<typename T>
SqStack<T>::~SqStack(){
delete []data;
}
template<typename T>
bool SqStack<T>::EmptyStack(){
return top==-1?true:false;
}
template<typename T>
bool SqStack<T>::Push(T e){
if(top==MAXSIZE-1) return false;
top++;
data[top]=e;
return true;
}
template<typename T>
bool SqStack<T>::Pop(T &e){
if(EmptyStack()) return false;
e=data[top];
top--;
return true;
}
bool IsMatch(char str[]){
int i;
char ch;
SqStack<char> s;
for(i=0;str[i]!='\0';i++){
if(str[i]=='('||str[i]=='['||str[i]=='{') s.Push(str[i]);
else{
if(str[i]==')'){
if(!s.Pop(ch)) return false;
if(ch!='(') return false;
}
if(str[i]==']'){
if(!s.Pop(ch)) return false;
if(ch!='[') return false;
}
if(str[i]=='}'){
if(!s.Pop(ch)) return false;
if(ch!='{') return false;
}
}
}
if(s.EmptyStack()) return true;
else return false;
}
int main(){
char str1[MAXSIZE];
cin.getline(str1,MAXSIZE);
if(IsMatch(str1)) cout<<"Right!"<<endl;
else cout<<"ERROR!"<<endl;
return 0;
}