表达式的括号匹配实际上就是每个左右括号是否有相对的另一半。所以有栈来模拟顺序。

#include<bits/stdc++.h>
using namespace std;
stack<char>v;
int main()
{
    string s;
    cin>>s;
    int p=0;
    while(s[p]!='@')//结束条件
    {
        if(s[p]=='(')//左括号压栈
        {
            v.push(s[p]);
        }
        else if(s[p]==')')
        {
            if(!v.empty()&&v.top()=='(')//如果栈顶是(且现在是),是一对,所以弹出(
            {
                v.pop();
            }
            else
            {
                v.push(s[p]);
            }
        }
        p++;
    }
    if(v.empty())//栈空则说明所有括号均配对
    {
        cout<<"YES";
    }
    else
    {
        cout<<"NO";
    }
}