stack的运用

版权声明:个人做题总结专用~ https://blog.csdn.net/tb_youth/article/details/84675759

1273: 夫妻
Time Limit: 1 Sec Memory Limit: 32 MB
[Submit][Status][Web Board]
Description

有n对夫妻围成一个圈站,他们每个人被连续的编号为1至2n。丈夫和妻子不一定站在一起。现在,对于一对夫妻,如果他们两人中间没有隔任何其他人(站在一起),那么,他们将牵手离开。直到所有人都离开或者留下的人不能成功牵手,游戏结束。

现在请问:是否所有的夫妻都能成功牵手走出这个圆圈呢?

Input

输入包含多组测试数据。每组测试数据中,第一行为一个整数n(1<=n<=100000),表示有n对夫妻。之后的n行中,每行包含两个整数a和b,表示a与b是一对夫妻,他们初始时站的位置为a和b。

n=0表示程序终止输入。

Output

如果所有的夫妻都能成功牵手离开,输出“Yes”,否则,输出“No”。

Sample Input

4
1 4
2 3
5 6
7 8

2
1 3
2 4

扫描二维码关注公众号,回复: 4410659 查看本文章

0

Sample Output

Yes
No

HINT

Source

ZSU

ACcode~:

#include <stdio.h>
#include <string.h>
#include <stack>
using namespace std;
int a[200005];
int main()
{
    int n,x,y;
    while(~scanf("%d",&n)&&n)
    {
        memset(a,0,sizeof(a));
        for(int i = 1; i <= n; i++)
        {
           scanf("%d%d",&x,&y);
            a[x] = a[y] = i;//第i对夫妇两人编号为i
        }
        stack<int>s;
        s.push(a[1]);//先把第一个人压入栈
        for(int i = 2; i <= 2*n; i++)
        {
            if(!s.empty()&&s.top() == a[i])//下一个人如果和栈顶这个为夫妇,就pop栈顶
                s.pop();
            else if(!s.empty()&&s.top()!=a[i]||(s.empty()))//栈顶这个人不与下一个人不为夫妇或栈空了就让下一个人入栈
                s.push(a[i]);
        }
        if(s.empty())
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

/*
总结:
1.使用前加头文件#include 和using namespace std;
2.定义stack对象:
stacks;//int 型叫s的stack对象;
3.基本操作:
1)s.push(x);//将x压入栈
2)s.pop();//栈顶元素出栈
3)s.top();//访问栈顶元素
4)s.empty();//判断栈是否为空,是返回true
5)s.size();//栈中元素个数
*/

猜你喜欢

转载自blog.csdn.net/tb_youth/article/details/84675759