大家支持一下小学生,点个关注呗~
题目描述
小爱观察奶奶玩的消消乐游戏,他想自己设计一个类似的程序。
程序要求:给定由 n 个数组成的数列,其中相邻的两个数字如果相同就可以相互消除,然后后面的数字按照顺序向前移动填补空位,填补之后如果依然出现相邻数字相同,则继续消除并移动,直至不存在能相互消除的数字为止。
现在请您验算一下,给定的数列能否实现全部消除(数列中的每一个数都被消除掉)。如果能输出 YES ,否则输出 NO 。
输入格式
第一行一个正整数 n (n≤1000) , n 一定为偶数,不必讨论。
第二行为 n 个空格隔开的正整数( int 范围内 )
输出格式
输出 YES 或 NO
样例 #1
样例输入 #1
10
1 2 3 3 2 1 1 2 2 1
样例输出 #1
YES
知识纲要
栈是什么
栈(可以当作死胡同):FILO,先进后出(所以只能对最后的元素进行操作)
栈的头文件
#include<stack>
定义栈
stack<T>//容器名
例
stack<int> stk;
栈的函数常用应用
stk.push(x);//入栈 stk.pop();//尾元素出栈 stk.top();//调用栈的的尾元素 stk.size();//遍历栈的元素个数 stk.empty();//如果栈为空返回值为true
解题思路
输入这个栈,如果栈尾(stk.top)等于新的x,消除栈尾,不是就把新x存进栈。结束后判断栈是否为空,是就输出对,不是就输出错。
代码
无讲解版
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
stack<int>stk;
cin>>n;
int x;
for(int i=1;i<=n;i++)
{
cin>>x;
if(stk.empty()||x!=stk.top())
{
stk.push(x);
}
else if(x==stk.top())
{
stk.pop();
continue;
}
}
if(stk.empty())
{
cout<<"YES";
}
else
{
cout<<"NO";
}
return 0;
}
附讲解版
/*csdn博客,钓鱼的肝,csdn bocker,fishing's liver,csdn buoke,diaoyudegan*/
#include<bits/stdc++.h>
//万能头
using namespace std;
int main(){
//主函数
int n;
//定义n(操作次数)
stack<int>stk;
//定义栈
cin>>n;
//输入n
int x;
//定义x
for(int i=1;i<=n;i++)//循环n次
{
cin>>x;//输入x
if(stk.empty()||x!=stk.top())//判断
{
stk.push(x);
//入栈
}
else if(x==stk.top())
{
stk.pop();
//栈为出栈
continue;
}
}
if(stk.empty())//判断是否为空
{
cout<<"YES";//是
}
else
{
cout<<"NO";//否
}
return 0;//返回0
}