CodeForces 158C

  这个题我们又把题意理解错了,队友翻译了以后给我解释,我问这个直接一个单词开头的是要找到这个文件夹吗,他说是,然后我就呵呵了..奔着树形结构去和字符串维护就去了...做了好久都没模拟出来,感觉做出来的人也牛了..重名问题怎么解决的啊....但是!!!!

其实没有那么复杂,题目中总共有三种情况:以"/"开头是指新建一个根目录,以前清空就行了,".."是返回上一层的文件夹,"单词开头"就是在停在的文件夹处建立这个单词所描述的文件夹,可以与父亲重名.与常识完全符合.这种操作方法是Linux操作系统里面的,题目让我们模拟过程输出路径,Linux学的人会对这个题很有感觉,而且这个题是CCF认证的一道题,真是应了那句话,题读懂了就简单,读不懂就难啊.

下面是代码,我使用栈维护并输出.

#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
stack<string>s1;///用于存储
stack<string>s2;///用于输出
int main()
{
    int t;
    scanf("%d",&t);
    while(!s1.empty()) s1.pop();
    while(!s2.empty()) s2.pop();
    while(t--)
    {
        string op;
        cin>>op;
        if(op[0] == 'p')
        {
            cout<<"/";
            while(!s1.empty())
            {
                s2.push(s1.top());
                s1.pop();
            }
            while(!s2.empty())
            {
                cout<<s2.top();
                s1.push(s2.top());///这个要加上去,因为我不会遍历栈的元素..
                s2.pop();
            }
            cout<<endl;
        }
        else
        {
            string a;
            cin>>a;
            int leno = a.length();
            a[leno++] = '/';
            a[leno] = '';
            string now;
            now = "";///取出每个单词,一种三种情况,对应题目的描述
            for(int i = 0; i < leno; i++)
            {
                now += a[i];
                if(a[i] == '/')
                {
                    if(now == "../")
                    {
                        if(!s1.empty()) s1.pop();///判断勿忘,返回一个文件夹
                    }
                    else if(now == "/")
                    {
                        while(!s1.empty()) s1.pop();///重新建立根目录,清空所有
                    }
                    else///在当前文件夹里新建文件夹
                    {
                        s1.push(now);
                    }
                    now = "";///清空勿忘
                }///文件夹是我这么说而已,为了便于理解,其实是目录的说....
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jifahu/p/5471914.html