括号匹配问题(栈)C++

题目描述
  在一个表达式中含有圆括号或方括号等来表示运算的优先级,将这些括号提取出来就构成了括号序列 例如:表达式[(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;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值