题目:
https://www.luogu.com.cn/problem/P8824
题目描述
有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个 Terminal。
具体来说,它需要支持如下命令:
-
touch filename
:如果名为filename
的文件不存在,就创建一个这样的文件,如果已经存在同名文件的话则不进行任何操作。 -
rm name
:删除名为name
的文件。如果不存在这样的文件,就不进行任何操作。 -
ls
:按创建时间为顺序,显示当前已经存在的未被删除的所有文件。 -
rename xxx yyy
:将名为xxx
的文件名字改为yyy
。如果不存在这样的文件,或者已经存在文件名为yyy
的文件,则不做任何操作。
这里所有涉及的文件名都仅由大写或者小写的英文字母构成,且文件名区分大小写。
输入格式
第一行一个整数 n ,表示总共要执行的操作数。
接下来 n 行,每行一个字符串,表示一条命令。
输出格式
对于每个 ls
命令,请输出若干行,每行一个字符串,表示一个文件,如果当前并没有任何文件,则什么都不输出。
请注意本题时限为 3s,输入输出规模较大,请注意常数因素对耗时的影响,我们不会给使用 Java 和 Python 的选手增加额外的运行时间。
思路:
我们可以使用cin提取到每行第一个字符串的命令,根据命令行驶函数。每个命令都要利用遍历去实行功能。注释我打的很清晰,看注释就好了。
#include<iostream>
#include<string>
using namespace std;
int n;
string line[1005];//储存字符串
void fun1(string s,int i)//tounch函数
{
for(int k = 1 ; k <= i ; k++)
{
if(s == line[k])
break;//有相同部分就不创新
}
line[i] = s;//没找到就自己创新一个
}
void fun2(string s,int i)//rm函数
{
for(int k = 1 ; k <= i ; k++)
{
if(s == line[k])
{
line[k].clear();//找到目标可以删除字符串
break;
}
}
}
void fun3(string s1,string s2,int i)//rename函数
{
bool found1,found2;
found1 = found2 = false;//两个为true作为可以执行的条件
int pos1 = -1,pos2 = -1;//记录下标
for(int k = 1 ; k <= i ; k++)
{
if(line[k] != s2)//不存在s2文件
{
found2 = true;
pos2 = k;
}
if(line[k] == s1)//存在s1文件
{
found1 = true;
pos1 = k;
}
}
if(found1 && found2)//条件成功可以修改
{
line[pos1] = s2;
}
}
void fun4(int i)//ls函数
{
for(int k = 1 ; k <= i ; k++ )
{
if(!line[k].empty())//判断字符串是否为空
cout << line[k] <<endl;
}
}
int main(void)
{
cin >> n;
string a,b,c;
for(int i = 1 ; i <= n ; i++)
{
cin >> a;
if(a == "touch")
{
cin >> b;
fun1(b,i);
}
else if(a == "rm")
{
cin >> b;
fun2(b,i);
}
else if(a == "rename")
{
cin >> b >> c;
fun3(b,c,i);
}
else if(a == "ls")
{
fun4(i);
}
}
return 0;
}