Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
"/../"
?"/"
.‘/‘
together,
such as "/home//foo/"
."/home/foo"
.思路:使用栈辅助数据结构,来遍历整个字符串,注意在遍历字符串,根据当前字符和栈顶的字符来消除栈空间的内容,最后栈中留下的东西正好是最终的路径,不过觉得使用向量也非常合适
#include <iostream> #include <string> #include <vector> #include <stack> using namespace std; /* 给一个Unix下面的路径表示方式 给出最终的结果 使用栈来消除复杂的表达方式 */ string SimplifyPath(string& str) { string result; stack<char> st; if(str.length() == 0 || str[0] !='/') return result; int i; char tmp; st.push(str[0]); for(i=1;i<str.length();i++) { tmp = st.top(); if(isalpha(str[i])) //是字母 st.push(str[i]); if(str[i]=='/' && i!=str.length()-1) { if(tmp != '/' && tmp != '.') // 斜线 { st.push(str[i]); } if(tmp == '.') { st.pop(); } } if(str[i]=='.') //逗点 { if(tmp == '.') { st.pop(); st.pop(); if(!st.empty()) tmp = st.top(); while(!st.empty() && tmp != '/') { st.pop(); tmp = st.top(); } if(st.empty()) st.push('/'); } else st.push(str[i]); } } result.append(st.size(),'c'); i=st.size()-1; while(!st.empty()) { tmp = st.top(); st.pop(); result[i--] = tmp; } return result; } int main() { string str("/a/./b/../../c/"); //string str("/../"); cout<<SimplifyPath(str); return 0; }
原文地址:http://blog.csdn.net/yusiguyuan/article/details/44853291