Simplify Path--LeetCode

题目:

Given an absolute path for a file (Unix-style), simplify it.

For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

click to show corner cases.

Corner Cases:
  • Did you consider the case where path = "/../"?
    In this case, you should return "/".
  • Another corner case is the path might contain multiple slashes '/' together, such as "/home//foo/".
    In this case, you should ignore redundant slashes and return "/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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值