hrbust/哈理工oj 1677 一个函数【栈】【水题】

一个函数
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 49(38 users) Total Accepted: 39(36 users) Rating:  Special Judge: No
Description

现在用一个函数来处理一个字符串(该字符串只包含x和y)。

函数的两个操作如下。

1.  在字符串中找到两个连续的字符(可以不相邻),并且第一个字符是’y’,第二个字符是’x’,然后交换它们。如果一次存在多种满足该条件的连续字符,我们就找到最靠近字符串开始位置的那组进行操作。

2.  在字符串中找到两个连续的字符(可以不相邻),并且第一个字符是’x’,第二个字符是’y’,

然后从原串中将这两个字符删除。如果一次存在多种满足该条件的连续字符,我们就找到最靠近字符串开始位置的那组进行操作。

函数的运行步骤如下:

Step1: 如果你对当前的字符串至少可以进行上面两个操作中的一个,就进入Step2,否则函数运行结束。

Step2:如果你可以进行1 操作就执行它。否则执行2操作1次,2操作结束后进入Step1.

请输出函数运行结束之后经过处理符串。

Input
输入一个字符串,保证字符串不为空且仅由’x’和’y’组成。字符串长度为1~106
Output
输出函数返回值。

保证测试数据不会让返回值为空串。

Sample Input

x

yxyxy

xxxxxxy

Sample Output

x

y

xxxxx

Author
曾卓敏 @hrbust

思路:只要有一对xy就一定能够消除

直接用一个栈来收入当前字符,如果栈顶和当前字符不同,相当于匹配出去一个y,栈顶出栈,相反入栈。

最后输出栈内元素即可:


#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
char a[1000050];
int main()
{
    while(~scanf("%s",a))
    {
        stack<char >s;
        int n=strlen(a);
        for(int i=0;i<n;i++)
        {
            if(s.size()==0)s.push(a[i]);
            else
            {
                if(s.top()==a[i])s.push(a[i]);
                else s.pop();
            }
        }
        while(!s.empty())
        {
            printf("%c",s.top());
            s.pop();
        }
        printf("\n");
    }
}











你可能感兴趣的:(1677,1677,hrbust,哈理工oj)