/*
总结:
1、strtoc、strcat实现字符串拆解和拼接;
2、堆栈的妙用使得遭遇“..”时能够使上一个文件出栈;
注意点:
1、字符串一定要以“\0”结尾,定义时未添加“\0”导致很久找不到错误;
2、通过函数修改结构体时,使用结构体指针,指向结构体内容时使用“->”,使用结构体变量时使用“.”;
3、出栈时没有判断pop是否≥0,导致出现"/a/../../b/../c//.//" 用例时出现错误;
难点:
1、结构体实现栈初始化、入栈、出栈;
2、strtoc、strcat实现字符串拆解和拼接;
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct stack
{
char** p;
int pop;
}ST;
void stackInit(ST* sp,int capacity)
{
sp->p=malloc(sizeof(char*)*capacity);
sp->pop=-1;
}
void stackPush(ST* sp,char* dir)
{
sp->p[++sp->pop]=strdup(dir);
}
void stackPop(ST* sp,char* dir)
{
if(sp->pop>=0)
{
sp->pop--;
}
}
void stackFree(ST* sp)
{
while(sp->pop>=0)
{
free(sp->p[sp->pop--]);
}
free(sp->p);
}
char* simplifyPath(char* path)
{
int len=strlen(path);
char* ret=malloc(sizeof(char)*(len+1));
ret[0]='/';
ret[1]='\0';
ST st;
int capacity=100;
stackInit(&st,capacity);
char* token;
token=strtok(path,"/");
while(token!=NULL)
{
if(strcmp(token,"..")==0)
{
stackPop(&st,token);
}
else if(strcmp(token,".")!=0)
{
stackPush(&st,token);
}
token = strtok(NULL, "/");
}
for (int i = 0; i <= st.pop; i++) {
strcat(ret, st.p[i]);
if (i < st.pop) {
strcat(ret, "/");
}
}
stackFree(&st);
return ret;
}
力扣C语言-71. 简化路径
于 2025-05-12 14:18:57 首次发布