每天6道题之第十四题:简化路径(栈)

前言

在这里插入图片描述

题目描述

以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix
风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…)
表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs
相对路径 请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 /
结尾。此外,规范路径必须是表示绝对路径的最短字符串。

解题思路

题解:
这道题仍然用栈的思想来解决,和之前的思路一样
我们要考虑几种情况:
(1)当遍历到"/“时:就令其变为空格
(2)当遍历到”.“时:什么操作都没有
(3)当遍历到”…“时:弹出栈顶元素 ,如果当前栈顶为空,就返回”/"
(4)当遍历到字母时: 字母入栈
然后在最后合并res(res是用来记录/和当前栈里面的内容的)和栈中的内容

完整代码

#include<iostream>
#include<string>
#include<stack>
#include<vector>
using namespace std;
//题解:
// 这道题仍然用栈的思想来解决,和之前的思路一样
//我们要考虑几种情况:
//(1)当遍历到"/"时:就令其变为空格 
//(2)当遍历到"."时:什么操作都没有 
//(3)当遍历到".."时:弹出栈顶元素 ,如果当前栈顶为空,就返回"/" 
//(4)当遍历到字母时: 字母入栈
//然后在最后合并res(res是用来记录/和当前栈里面的内容的)和栈中的内容 
class Solution{
	public:
		string simplifyPath(string path){
			if(path=="/")
				return "/";
			for(int i=0,i<path.size();i++){
				if(path[i]== '/'){
					path[i]='';
				}
			}
			vector<string> stack;
			istringstream str(path); //这一步有点去掉空格的感觉,其实就是分割字符 
			string buf;
			while(str>>buf){
				if(buf==".." && !stack.empty())//当遍历到".."时,就将当前栈顶元素出栈,在vector中表示为pop_back,并删除 
					stack.pop_back();
				else if(buf!="." && buf!="..")//当遍历到字母的时候就把字符串入栈 
					stack.push_back(buf);
			}
			if(stack.empty()){//如果遇到".."时栈为空,那么直接返回一个"/",但是并不保存此"/" 
				return "/";
			} 
			string res;
			for(int i=0;i<stack.size();i++){
				res=res+"/"+stack[i]; 
			}
			return res;
			
		}
};
	
int main(){
	string str;
	getline(cin,str);
	string 		     
	path=Solution().simplifyPath(str);
	cout<<path<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值