用stack实现括号匹配

  这个代码是我自己写的

  是对QDU周强老师的一个题写出来的

  (())四个字符标号为1234,我们让24配对,13也是配对的,这个道理,我们应该明确

  算法逻辑:将字符串中的左右括号的数组下标分别存放在两个stack中,我们可以知道,栈顶元素的值就是该栈的最大值,要想配对,左括号的下标一定要小于右括号的下标,所以,一旦有一个左括号的下标大于了右括号栈顶的下标,就一定没有与其匹配的括号,即这段字符串的括号是不匹配的

#include<cstdio>
#include<iostream>
#include<stack>
#include<string>
using namespace std;
stack<int> small_left;
stack<int> small_right;
stack<int> mid_left;
stack<int> mid_right;
stack<int> big_left;
stack<int> big_right;
string line;
bool Handle(int c)
{
    if(c == 1)
    {
        int left_len;
        int right_len;
        left_len = small_left.size();
        right_len = small_right.size();
        if(left_len == right_len)
        {
            bool flag = true;
            while(!small_left.empty())
            {
                if(small_left.top() > small_right.top())
                {
                    flag = false;
                    break;
                }
                else
                {
                    small_left.pop();
                    small_right.pop();
                }
            }
            return flag;
        }
        else return false;
    }
    else if(c==2)
    {
        int left_len;
        int right_len;
        left_len = mid_left.size();
        right_len = mid_right.size();
        if(left_len == right_len)
        {
            bool flag = true;
            while(!mid_left.empty())
            {
                if(mid_left.top() > mid_right.top())
                {
                    flag = false;
                    break;
                }
                else
                {
                    mid_left.pop();
                    mid_right.pop();
                }
            }
            return flag;
        }
        else return false;
    }
    else
    {
        int left_len;
        int right_len;
        left_len = big_left.size();
        right_len = big_right.size();
        if(left_len == right_len)
        {
            bool flag = true;
            while(!big_left.empty())
            {
                if(big_left.top() > big_right.top())
                {
                    flag = false;
                    break;
                }
                else
                {
                    big_left.pop();
                    big_right.pop();
                }
            }
            return flag;
        }
        else return false;
    }
}
int main()
{
    int left = 0;
    int right = 0;
    getline(cin,line);
    for(int i = 0; i < line.length(); i++)
    {
        if(line[i] == '(')
        {
            small_left.push(i);
            left++;
        }
        else if(line[i] == ')')
        {
            small_right.push(i);
            right++;
        }
        else if(line[i] == '[')
        {
            mid_left.push(i);
            left++;
        }
        else if(line[i] == ']')
        {
            mid_right.push(i);
            right++;
        }
        else if(line[i] == '{')
        {
            big_left.push(i);
            left++;
        }
        else if(line[i] == '}')
        {
            big_right.push(i);
            right++;
        }
    }
    bool flag1 = Handle(1);
    bool flag2 = Handle(2);
    bool flag3 = Handle(3);
    cout<<left<<" "<<right<<endl;
    if(flag1 && flag2 && flag3)
        cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}

但是这段代码可能存在小bug,错了一个点,过几天我再来填坑

发布了35 篇原创文章 · 获赞 0 · 访问量 926

猜你喜欢

转载自blog.csdn.net/ACM_Cmy/article/details/104052729