P1739 表达式括号匹配

P1739 表达式括号匹配

题目描述
假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。

输入格式
一行:表达式

输出格式
一行:“YES” 或“NO”

输入输出样例

输入 #1

2*(x+y)/(1-x)@

输出 #1

YES

输入 #2

输出 #2

NO

思路:利用栈的思想进行匹配,设置栈为bool类型,遇到“( ",将true压入栈,遇到“ )”,进行出栈操作。

#include
#include
#include
#include
using namespace std;
//思路:运用栈的的方法,将“( ”压入栈,“)”用来进行检测
string s;//输入的字符串
stack<bool> st;//栈

int main()
{
    bool flag=true;
    cin>>s;
    for(int i=0;s[i]!='@';i++){
        if(s[i]=='('){
            st.push(true);
        }
        else if(s[i]==')'){
            if(st.empty()){//如果匹配到")",且栈为空的话,肯定不能进行出栈操作了
                flag=false;
                break;//直接跳出循环,不用考虑了
            }
            st.pop();//否则就弹出匹配的一个"("
        }
    }
    if(!st.empty()){//最后一个栈内元素不为空,说明没有匹配
        flag=false;
    }
    printf("%s\n",flag?"YES":"NO");
    return 0;
}

P1739 表达式括号匹配_第1张图片

你可能感兴趣的:(简单的算法练习)