浏览网页

问题描述:
作为温州大学的学生,肯定经常在学校食堂吃饭(大家不要去学校门口大小店吃饭哦,很多用的是地沟油)。教工食堂用大托盘大家肯定不陌生,其实教工食堂大托盘隐含了计算机科学中大一个非常重要的数据结构:栈。假设食堂只有一叠托盘,当有人去吃饭的时候,总是把这叠托盘的最上面一个托盘拿走,同时假设有人在洗使用过的托盘,每洗好一个托盘,就把它放在这叠托盘的最上面。
在计算机系统中,栈是一种特殊的线性表(大家学过的数组就是最简单的线性表的组织方式,当然链表也是)。它只能在某一端插入和删除数据。栈按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。数据被压入栈的操作称为入栈,数据从栈里面出来大操作称为出栈。

学校食堂的托盘可以看作是栈这种数据结构的一种表现形式,生活中还有很多地方有类似栈的操作,大家肯定都上过网,浏览网页的浏览器(IE,firefox)都具有历史功能,就是你最近访问过的网页地址可以利用浏览器上的后退功能访问,也可以用前进功能往前访问网页(为后退功能的反向操作)。


请使用一个栈来实现浏览器的前进后退功能。
需要实现的功能如下:
BACK:退回到前一个访问的网页,如果不存在前一个访问的网页,则忽略该命令。
FORWORD:BACk命令的反向操作,如果之前没有执行过BACK命令,则忽略该命令。
VISIT:把当前页面地址放入栈顶,并把它作为当前页面地址。清空前进栈。
QUIT: 退出浏览器。

假设初始浏览器地址为空,并且栈为空。 

输入:

输入时一些的命令序列。命令有 BACK, FORWARD, VISIT, 和QUIT ,所有命令都由大写字母构成。
地址中不包含空白字符,并且最多只有70个字符。
你可以假设整个过程中,栈中的元素不会超过100个。每个输入的最后一个命令都是QUIT。 

输出:

对于每一个不是QUIT的命令, 输出命令执行后浏览器的当前页面的地址,如果命令被忽略了,则输出"Ignored"。
每个命令的输出都在单独的一行中,QUIT命令没有任何输出。

样例:

输入样列
VISIT http://acm.wzu.edu.cn/
VISIT http://acm.ashland.edu/
VISIT http://acm.baylor.edu/acmicpc/
BACK
BACK
BACK
FORWARD
VISIT http://www.ibm.com/
BACK
BACK
FORWARD
FORWARD
FORWARD
QUIT
输出样例
http://acm.wzu.edu.cn/
http://acm.ashland.edu/
http://acm.baylor.edu/acmicpc/
http://acm.ashland.edu/
http://acm.wzu.edu.cn/
Ignored
http://acm.ashland.edu/
http://www.ibm.com/
http://acm.ashland.edu/
http://acm.wzu.edu.cn/
http://acm.ashland.edu/
http://www.ibm.com/
Ignored

代码:

解题思路:

用p节点来表示游标。

  • visit实现:将s节点(要存入的url所在的节点)放在p节点后并且用移动p游标指向这个节点。
  • back实现:及用链表的查找方式来查找p节点前面一个节点,并且将游标指向这个节点。当p节点处于L头节点或者是第一个节点时候,由于不存在前一个节点,所以不能移动游标,及ignore.
  • forward实现:查找p节点的下一个节点,并将游标指向这个节点。当p节点是最后一个节点时候,由于不存在后一个节点只能ignore.

  • 代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct web{
    char IE[100];
    struct web *next;
}web;
web *createList()  
{  
    web *L;  
    L=(web *)malloc(sizeof(web));  
    L->next=NULL;  
    return L;  
}  
web *insList(web *L,web *s,web *p)  
{  
    p->next=s;  
    s->next=NULL;  
    return s;  
}  //尾插法,插入p这个游标的后面。 
web *back(web *p,web *L)
{
	web *pre;
	pre=L->next;
	if(p==L || p==L->next){
		return p;
	}//ingore的条件是p不是头节点或者第一个节点。 
	while ( pre->next!=p){
		pre=pre->next;
	}
	return pre;
   
}//查找p游标前面一个节点,返回节点,如果不能就把p节点返回。 
web *forward(web *p,web *L)
{
	if(p->next==NULL)//ignore的条件是p是最后一个节点。 
		return p;
	else
		return p->next;
}//查找p节点后面一个节点,如果没有返回p节点。 
int main()
{
    char IE[100];
    web *L;
    web *s;
    web *p;
    char order[10];
    L=createList();
    p=L;
    while(1){
        scanf("%s",order);
        if(strcmp(order,"VISIT")==0){
            scanf("%s",IE);
            s=(web*)malloc(sizeof(web));
            strcpy(s->IE,IE);
            insList(L,s,p);
           	printf("%s\n",s->IE);
           	p=s;
        }
        if(strcmp(order,"BACK")==0){
            if(p==back(p,L))
                printf("Ignored\n");
            else{
                printf("%s\n",back(p,L)->IE);
                p=back(p,L);
            } 
        }
        if(strcmp(order,"FORWARD")==0){
            if(p==forward(p,L))
                printf("Ignored\n");
            else{
                printf("%s\n",forward(p,L)->IE);
                p=forward(p,L);
        	}
        }
        if(strcmp(order,"QUIT")==0)
           break;
    }
    return 0;
}

具体分析以后。。。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值