页面访问模拟

页面模拟(进入页面,返回页面)

3.360浏览器的前进后退功能 大家平时都爱上网看新闻、购物等等,你们浏览网页时,有没有类似这样的经历。比如,打开京东网站的笔记本电脑分类,进入页面A,然后点击品牌联想,进入 到页面B,再点击第一种商品,进入页面C,浏览器左上角有前进、后退按钮, 如果点击回退按钮,则退回页面B,再点击回退按钮,退回页面A。如果退到页 面B时没有继续回退,而是打开了新的页面D,则无法返回到页面C了。 请设计算法,模拟实现浏览器中的前进后退功能。

并回答以下问题:

1.你选用了哪种(或哪些)数据结构来实现该功能,这个(些)数据结构的特点 是什么?跟本问题的契合点在哪里?

2.你的程序中采用了哪种存储结构来存放数据结构?说说为何选用该存储结构。

3.给出具体编码与运行结果(包括代码和运行结果的截图)。


选用了哪种(或哪些)数据结构来实现该功能,这个(些)数据结构的特点 是什么?跟本问题的契合点在哪里?

数据结构:

(1)树形结构:存储页面网址或者相关的数据

特点:在页面访问中,每个页面都有自己的子页面,将首次打开的页面当成一个树的根,将这种页面含有子页面的结构就可以看成一棵树,就这样每个树的结点就只需要记录结点的parent结点的编号和网址或地址就行了

这里是静态赋值的一部分

下标 parent      text[100]   页面网址信息
1-1

http//:local_disk.com

21

http//:temp.com

31

http//:Windows.com

41

http//:User.com

52

http//:apollocCache.com

62

http//:openssl_debug.com

73

http//:Boot.com 

83http//:Branding.com
94http//:GaZhou.com
10

4

http//:公用.com
119http//:下载.com

(2)栈:利用栈来记录被访问过的页面的信息,并用栈的先进后出的特点将访问过的页面进行返回的操作


给出具体编码与运行结果(包括代码和运行结果的截图)。

树的结点结构和栈的结构

typedef  char ElemType;
typedef struct{
	ElemType visited[CSMAXSIZE][100];
	int top;
}FindHistory;
typedef struct csnode//可以用来保存页面 
{
	ElemType text[100];
	//ElemType text;
	int parent;
}CSNode,*CSTree;

//*******CSTree树的定义***

访问&&返回(入栈&&出栈) 

void pushHistory(FindHistory &s,char arr[])//入栈 
{
	if(s.top < CSMAXSIZE){
		strcpy(s.visited[++s.top],arr);
		printf("\n\nOpen the page>>>>>%s<<<<<<<<<---\n",s.visited[s.top]);
	}
}
Status popHistory(FindHistory &s,CSTree &T,int i,int flag)//出栈 
{
	//printf("s.top = %d\n",s.top);
	if(s.top <= 0){
		printf("\nNOT TO BACK!"); 
		return ERROR;
	}
	int n;
	flag = 1;
	s.top--;
	printf("\n\nBack The Page-----%s----\n",s.visited[s.top]);
	peekHistory(s,T,T[i].parent,flag);
	return OK;
}

创建树 

//****创建&&赋值***
Status CreatCS_Tree(CSTree &T)
{
	T = (CSTree)malloc((CSMAXSIZE)*sizeof(CSNode));
	if(!T) return ERROR;
	//动态赋值
//	for(int i = 1; i < CSMAXSIZE;i++){
//		int d;
//		printf("输入页面%d所属网址编码\n",i);
//		scanf("%d",&d);
//		if(d == 0) break;
//		T[i].parent = d;
//		printf("输入编码为%d页面的网址\n",i);
//		scanf("%s",&T[i].text);
//	}
//	//静态赋值 
	T[1].parent =-1;strcpy(T[1].text,"http//:local_disk.com");
	T[2].parent = 1;strcpy(T[2].text,"http//:temp.com");
	T[3].parent = 1;strcpy(T[3].text,"http//:Windows.com");
	T[4].parent = 1;strcpy(T[4].text,"http//:User.com");
	T[5].parent = 2;strcpy(T[5].text,"http//:apollocCache.com");
	T[6].parent = 2;strcpy(T[6].text,"http//:openssl_debug.com");
	T[7].parent = 3;strcpy(T[7].text,"http//:Boot.com");
	T[8].parent = 3;strcpy(T[8].text,"http//:Branding.com");
	T[9].parent = 4;strcpy(T[9].text,"http//:GaZhou.com");
	T[10].parent =4 ;strcpy(T[10].text,"http//:公用.com");
	T[11].parent = 9;strcpy(T[11].text,"http//:下载.com");
	return OK;
}

访问页面

//********访问和返回总函数*******
void peekHistory(FindHistory s,CSTree T,int i,int flag)
{
	char arr[100];
	strcpy(arr,T[i].text);
	if(flag == 0) pushHistory(s,arr);
	int data[CSMAXSIZE-1];
	int j,k,w;
	for(j = 0;j < CSMAXSIZE;j++)
		data[j] = 0;
	j = 0;
	for(k = 1;k < CSMAXSIZE;k++){
		if(T[k].parent == i&&i != 0){
			data[j++] = k;
			printf("\n%d--------%s------------",k,T[k].text);
		}
	}
	int n;
	if(data[0] == 0)
		printf("---------- Not Found! ----- ('0' To Back)\n");
	else printf("\n(Front Number Into The Page)\n('0' To Back)\n");
	scanf("%d",&n);
	int x;
	if(T[n].parent == i) x = 1;
	else x = 0;
	switch(x)
	{
		case 1:
			 for(w = 0;w <= 11;w++){
				if(data[w]==n && n != i)
					peekHistory(s,T,n,flag);
				if(data[w]==0)
					break;
			}
			break;
		case 0:
			popHistory(s,T,i,flag);
			break;
	}
}

完整代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
#define CSMAXSIZE 100
typedef  char ElemType;
typedef  int Status;
typedef struct{
	ElemType visited[CSMAXSIZE][100];
	int top;
}FindHistory;
typedef struct csnode//可以用来保存页面 
{
	ElemType text[100];
	//ElemType text;
	int parent;
}CSNode,*CSTree;
void InitHistory(FindHistory &s);//初始化栈
void pushHistory(FindHistory &s,char arr[]);//入栈 
Status popHistory(FindHistory &s,CSTree &T,int i,int flag);//出栈 
Status CreatCS_Tree(CSTree &T);
void peekHistory(FindHistory s,CSTree T,int i,int flag);
int main()
{
	CSTree T;
	FindHistory s;//栈 
	InitHistory(s);//初始化栈 
	CreatCS_Tree(T);//创造树形存储列表 
	peekHistory(s,T,1,0);//访问页面&&返回页面操作 
	return OK;
}
void InitHistory(FindHistory &s)//初始化栈 
{
	s.top = -1;
}
void pushHistory(FindHistory &s,char arr[])//入栈 
{
	if(s.top < CSMAXSIZE){
		strcpy(s.visited[++s.top],arr);
		printf("\n\nOpen the page>>>>>%s<<<<<<<<<---\n",s.visited[s.top]);
	}
}
Status popHistory(FindHistory &s,CSTree &T,int i,int flag)//出栈 
{
	//printf("s.top = %d\n",s.top);
	if(s.top <= 0){
		printf("\nNOT TO BACK!"); 
		return ERROR;
	}
	int n;
	flag = 1;
	s.top--;
	printf("\n\nBack The Page-----%s----\n",s.visited[s.top]);
	peekHistory(s,T,T[i].parent,flag);
	return OK;
}
Status CreatCS_Tree(CSTree &T)
{
	T = (CSTree)malloc((CSMAXSIZE)*sizeof(CSNode));
	if(!T) return ERROR;
	//动态赋值
//	for(int i = 1; i < CSMAXSIZE;i++){
//		int d;
//		printf("输入页面%d所属网址编码\n",i);
//		scanf("%d",&d);
//		if(d == 0) break;
//		T[i].parent = d;
//		printf("输入编码为%d页面的网址\n",i);
//		scanf("%s",&T[i].text);
//	}
//	//静态赋值 
	T[1].parent =-1;strcpy(T[1].text,"http//:local_disk.com");
	T[2].parent = 1;strcpy(T[2].text,"http//:temp.com");
	T[3].parent = 1;strcpy(T[3].text,"http//:Windows.com");
	T[4].parent = 1;strcpy(T[4].text,"http//:User.com");
	T[5].parent = 2;strcpy(T[5].text,"http//:apollocCache.com");
	T[6].parent = 2;strcpy(T[6].text,"http//:openssl_debug.com");
	T[7].parent = 3;strcpy(T[7].text,"http//:Boot.com");
	T[8].parent = 3;strcpy(T[8].text,"http//:Branding.com");
	T[9].parent = 4;strcpy(T[9].text,"http//:GaZhou.com");
	T[10].parent =4 ;strcpy(T[10].text,"http//:公用.com");
	T[11].parent = 9;strcpy(T[11].text,"http//:下载.com");
	return OK;
}
void peekHistory(FindHistory s,CSTree T,int i,int flag)
{
	char arr[100];
	strcpy(arr,T[i].text);
	if(flag == 0) pushHistory(s,arr);
	int data[CSMAXSIZE-1];
	int j,k,w;
	for(j = 0;j < CSMAXSIZE;j++)
		data[j] = 0;
	j = 0;
	for(k = 1;k < CSMAXSIZE;k++){
		if(T[k].parent == i&&i != 0){
			data[j++] = k;
			printf("\n%d--------%s------------",k,T[k].text);
		}
	}
	int n;
	if(data[0] == 0)
		printf("---------- Not Found! ----- ('0' To Back)\n");
	else printf("\n(Front Number Into The Page)\n('0' To Back)\n");
	scanf("%d",&n);
	int x;
	if(T[n].parent == i) x = 1;
	else x = 0;
	switch(x)
	{
		case 1:
			 for(w = 0;w <= 11;w++){
				if(data[w]==n && n != i)
					peekHistory(s,T,n,flag);
				if(data[w]==0)
					break;
			}
			break;
		case 0:
			popHistory(s,T,i,flag);
			break;
	}
}

运行结果截图

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是页面置换算法的模拟实现: 首先,我们需要定义一个内存块的类,用来表示内存中的一个页面: ```python class Page: def __init__(self, page_id): self.page_id = page_id self.last_used_time = 0 ``` 其中,`page_id` 表示页面的唯一标识符,`last_used_time` 表示该页面最近一次被访问的时间戳。 然后,我们定义一个内存管理器的类,用来模拟页面置换算法: ```python class MemoryManager: def __init__(self, memory_size, page_table): self.memory_size = memory_size self.page_table = page_table self.memory = [] def access_page(self, page_id): page = self.page_table[page_id] if page in self.memory: # 如果页面已经在内存中,则更新它的最近访问时间 page.last_used_time = time.time() else: if len(self.memory) < self.memory_size: # 如果内存还有空闲空间,则直接将页面加入内存中 self.memory.append(page) else: # 如果内存已满,则寻找最久未被访问页面,并将其替换为当前页面 oldest_page = min(self.memory, key=lambda p: p.last_used_time) self.memory.remove(oldest_page) self.memory.append(page) def print_memory(self): print('Memory:', [p.page_id for p in self.memory]) ``` 在上面的代码中,`memory_size` 表示内存的大小,`page_table` 是一个字典,用来存储所有页面的信息。`access_page` 方法用来模拟访问一个页面,如果该页面已经在内存中,则更新它的最近访问时间;否则,如果内存还有空闲空间,则直接将页面加入内存中;如果内存已满,则寻找最久未被访问页面,并将其替换为当前页面。`print_memory` 方法用来打印当前内存中的页面。 接下来,我们可以测试一下这个内存管理器的功能: ```python import time # 创建一些页面 page_table = {} for i in range(10): page_table[i] = Page(i) # 创建一个内存管理器,内存大小为 3 mm = MemoryManager(3, page_table) # 访问一些页面 mm.access_page(0) mm.access_page(1) mm.access_page(2) mm.access_page(3) mm.access_page(4) # 打印当前内存中的页面 mm.print_memory() # 访问一些页面 mm.access_page(1) mm.access_page(2) mm.access_page(4) mm.access_page(5) # 打印当前内存中的页面 mm.print_memory() ``` 输出结果如下: ``` Memory: [2, 3, 4] Memory: [2, 4, 5] ``` 可以看到,内存管理器根据页面置换算法模拟了内存中页面访问和替换过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值