这个题我们又把题意理解错了,队友翻译了以后给我解释,我问这个直接一个单词开头的是要找到这个文件夹吗,他说是,然后我就呵呵了..奔着树形结构去和字符串维护就去了...做了好久都没模拟出来,感觉做出来的人也牛了..重名问题怎么解决的啊....但是!!!!
其实没有那么复杂,题目中总共有三种情况:以"/"开头是指新建一个根目录,以前清空就行了,".."是返回上一层的文件夹,"单词开头"就是在停在的文件夹处建立这个单词所描述的文件夹,可以与父亲重名.与常识完全符合.这种操作方法是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] = '\0'; 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; }