题解 P1739 【表达式括号匹配】
好了,看到这么多大神都来踩一道 入门 题,那蒟蒻也就放心的来掺和掺和(不怕,咱脸皮厚)。
这道题我用的是栈(不要问我为什么,因为我搜索了栈的标签,专门来做栈的),如果不会的兄弟,那蒟蒻尽量在程序里把有关栈的部分给大家讲懂。
先讲讲思路,如果想要直接看程序的人也可以,蒟蒻还贴心的在程序内贴置了一些解释。
首先呢,我们先读入这个字符串(char也可以)注明:
以“@”作为表达式的结束符。
这句话是废话,可以直接 getline(cin,s);
其实好像也不是,蒟蒻忽然发现可以在读入的同时进行遍历(似乎也影响不大)
然后依次遍历,遇到左括号,就压入栈内:
if(s[i]=='(')
zhan.push(s[i]);
如遇右括号,有两种选择:
选择一:栈为空
注意了,重点来了,我就栽在了这个(坏东西)上面,如果栈为空,这证明有多余的右括号!于是我们就大声的对他说(输出):“NO”。
选择二:栈不为空
这就说明了有多余的左括号未匹配,本着后进先出的道理,正好和括号的性质相匹配,于是把栈末的左括号弹出:“BIU——”(哎呦,打到作者了O_o)。
直到循环结束,我们就可以再次判断栈是否为空。
如果为空,说明所有的左括号都已匹配(因为所有压入栈的左括号都已经弹出来了ya,并且在作者头上打出了大小不一的包,真疼~)我们就要对他表示勉强的肯定:“YES”。
反之,如果不为空,我们就大声的否定他(输出):“NO”(这一次作者不皮了)
下面又到了大家喜闻乐见的环节,让我们有请代码君为我们端上新鲜美味,可口又营养的(无防腐剂,干燥剂等添加)代码!
#include <bits/stdc++.h>
using namespace std;
int main(){
stack<char> zhan; //定义栈
string s;
getline(cin,s); //输入
for(int i=0; i<s.size(); i++){
if(s[i]=='(') //捕获左括号一枚~
zhan.push(s[i]); //压入栈(当场逮捕)
else if(s[i]==')'){ //捕获右括号一枚~
if(zhan.empty()){ //如果栈(天牢)空
cout<<"NO"<<endl; //把他赶出去
return 0;
}
else
zhan.pop(); //将栈顶左括号释放
}
}
if(zhan.empty()) //栈(天牢)为空
cout<<"YES"<<endl;
else //栈(天牢)不为空
cout<<"NO"<<endl;
return 0;
}