括号匹配问题 c++

【问题描述】假设一算术表达式中包括三种括号:圆括号(和),方括号[和];,花括号{和};,且三种括号可按意 次序嵌套使用,试编写程序判定输入的表达式所含的括号是否正确配对出现(已知表达式已存入数据元素为字符的顺序表中)。若匹配,则返回1,否则返回0。
【输入形式】含括号的算数表达式
【输出形式】1/0
【样例输入】3+(44*[5-{6*[7*(45-10)]}])
【样例输出】1
【样例说明】判断括号是否匹配涉及两方面,括号个数和出现次序的判定。

 代码:

#include<iostream>
/*
怎么去判断括号匹配呢?
那么就是左边的,如同(,[,{,这种就往堆栈里面放
,如果是右边的,如同),],},像这种的就要先去判断是否
这个堆栈的第一个字符知否和右边的匹配,如果是匹配的那么
就ok,但是如果不行的话,那么就是错的,直接退出



*/
using namespace std;
class Stack{
private:
    char data[100];
    int top;
public:
    Stack();
    void push(char a);
    void pop();
    bool isJudge(char a);
    int gettop();
};

Stack::Stack()
{
    top=0;
    data[0]='#';
}
void Stack::push(char a)
{
    top++;
    data[top]=a;
}
bool Stack::isJudge(char a)
{
    if(a==')')
    {
        if(data[top]=='(')
        {
            pop();
        }
        else
        {
            return false;
        }
    }
    else if(a==']')
    {
        if(data[top]=='[')
        {
            pop();
        }
        else
        {
            return false;
        }
    }
    else if(a=='}')
    {
        if(data[top]=='{')
        {
            pop();
        }
        else
        {
            return false;
        }
    }
    
    else
    {
        push(a);
    }
    return true;
    
    
}

void Stack::pop()
{
    top--;
}

int Stack::gettop()
{
    return top;
}

int main()
{
    Stack str;
    int len;
    bool flag=true;
    char s[100];
    cin>>s;
    len=strlen(s);
    for(int i=0;i<len;i++)
    {
        if(s[i]=='('||s[i]==')'||s[i]=='['||s[i]==']'||s[i]=='{'||s[i]=='}')
            {
                flag=str.isJudge(s[i]);
                if(flag==false)
                {
                    break;
                }
                
            }
    }
    if(str.gettop()==0)
    {
        flag=1;
    }
    //判断flag的值来看怎么输出
    if(flag==false)
    {
        cout<<'0'<<endl;
    }
    else
    {
        cout<<'1'<<endl;
    }
    return 0;
}




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值