新手请看
2025-02-04 16:33:56
发布于:北京
0阅读
0回复
0点赞
一个不错的练习栈运用的题目。
思路
首先我们要了解栈是什么。栈,又称LIFO表,如同你去垃圾桶翻垃圾(bushi),先翻到的永远是后扔进
去的垃圾(除非你在和其他人抢生意)。
所以可以利用这一特性,将后进的括号与栈顶(离他最近)的括号匹配消除,不影响后续和之前的括号。
当然,在本题的sub4中有先右在左的括号,所以要加一条判断,如果在空栈时直接有右括号,直接输出“NO”。
***在本题中没有“((”的组合,否则下面代码有问题。闲得发慌学习积极的同学可以尝试自己写更精准但较低速的代码。
代码
我知道你们已经等不及要 偷抄 借鉴了
#include<bits/stdc++.h>
using namespace std;
stack<char> ch;//定义一个stack容器
char n;
int main()
{
while(1)//等价于for(;1;)
{
cin >> n;
if(n == '@')break;
if(n == ')')
{
if(!ch.empty())//一定要加!sub4血的教训
n='(';
else{
cout << "NO";
return 0;
}
}
if(n!='(')continue;//剔除干扰项
if(ch.empty()||ch.top()!=n)ch.push(n);//如不匹配或第一个括号则进栈
else ch.pop();//匹配则出栈
}
if(ch.empty())cout << "YES";//判断答案,空栈说明全部匹配
else cout << "NO";
return 0;
}
祝你AC!
这里空空如也
有帮助,赞一个