http://acm.tju.edu.cn/toj/showp1196.html
这道题大一的时候也做过,现在再做还是有点难。第一想法是用一个char类型的二维数组存储每一个网址,模拟一下栈操作,事实上我也是这么做的==。
之前学到的memset现在已经越来越多的用到啦,首先还是对两个数组初始化。然后根据输入指令的首字母判断对应的是什么操作。设置一个direc变量用于指示当前位置(相当于栈顶指针),初始值为-1。
如果是VISIT,那么direc++,空出来一行存放当前访问的网址。在这里要注意,如果反复使用VISIT,可能会导致网址长短不一样,存放时有覆盖情况。所以我先判断当前位置是否为空,如果不为空,用memset清零,再存放。同时与下面的FORWARD指令连用时,如果之前多次使用VISIT,BACK之后VISIT再FORWARD会出现之前VISIT过的网址,因此我在这里将下一行清零。这样VISIT之后再FORWARD就不会出现网址了。
如果是BACK,那么比较简单,direc--,栈顶指针回移,返回上一行存放的网址,如果已经到了栈顶,那么返回初始网址,如果还BACK,那么就Ignored。
如果是FORWARD,那么如果下一行为空,Ignored即可。否则direc++,返回下一行的网址。
值得注意的是,在判断数组为空时,我遇到了一点问题。将数组元素设置为NULL,但是使用
if(website[direc])
语句判断时,却总是判断数组不为空。
后来在网上查到了解决办法:https://blog.csdn.net/selina8921/article/details/79176297
不论是对于常量字符串 const char* hi_str = "Hi str";
还是对于字符串变量 char * str;
我们都是可以用
if (str != NULL) {
if (strlen(str) == 0) {
// it is empty string
}
}
来判断。
--------------------- 本文来自 selina8921 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/selina8921/article/details/79176297?utm_source=copy
代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char website[100][100];
int main(){
char command[100];
int direc = -1;
memset(command, 0, sizeof(command));
memset(website, 0, sizeof(website));
while(gets(command) && command[0] != 'Q'){
if(command[0] == 'V'){
int k = 0;
direc++;
if(website[direc]){
memset(website[direc], 0, sizeof(website[direc]));
for(int j = 6; j < strlen(command); j++){
website[direc][k] = command[j];
k++;
}
}
memset(website[direc+1], 0, sizeof(website[direc+1]));
printf("%s\n", website[direc]);
//printf("%d\n", direc);
}
if(command[0] == 'B'){
if(direc == 0){
direc--;
printf("http://www.acm.org/\n");
//printf("%d\n", direc);
}
else if(direc > 0){
direc--;
printf("%s\n", website[direc]);
//printf("%d\n", direc);
}
else{
printf("Ignored\n");
//printf("%d\n", direc);
}
}
if(command[0] == 'F'){
direc++;
if(website[direc]){
if(strlen(website[direc])){
printf("%s\n", website[direc]);
//printf("%d\n", direc);
}
else{
direc--;
printf("Ignored\n");
//printf("%d\n", direc);
}
}
}
}
return 0;
}