TOJ1196

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值