当前位置:   article > 正文

C语言数据结构课程设计 模拟浏览器操作程序_程序模拟网页

程序模拟网页

模拟浏览器操作程序

问题描述

标准Web浏览器具有在最近访问的网页间后退和前进的功能。实现这些功能的一个方法是:使用两个栈,追踪可以后退和前进而能够到达的网页。在本题中,要求模拟实现这一功能。

需求分析

需要支持以下指令
(1)BACK:将当前页推到“前进栈”的顶部。取出“后退栈”中顶端的页面,使它成为当前页。若“后退栈”是空的,忽略该命令。
(2)FORWARD:将当前页推到“后退栈”的顶部。取出“前进栈”中顶部的页面,使它成为当前页。如果“前进栈”是空的,忽略该命令。,
(3)VISIT <url>:将当前页推到“后退栈”的顶部。使URL特指当前页。清空“前进栈”。,URL中没有空格,最多70个字符。
(4)QUIT:退出浏览器。除了QUIT命令外,若某一命令没有被忽略掉,则在命令执行后输出当前页的URL,否则输出“Ignored”。对每个输入命令,产生相应的输出。QUIT命令不产生任何输出。 

(5)针对所有测试数据,任何时候在每个栈中的元素都不超过100个。

(6)假设浏览器首先加载的网页URL是: http://www.acm.org/。

算法设计和实现

(1)功能图    f57fd71044724712a16f5f86ba51cecf.png

(2)概要设计

void PUSHQ(QU* qu, char cur[])//入队

void POPQ(QU* qu)//出队

void PUSH(ST* st, char cur[])//入栈

void POP(ST* st)//出栈

int EMPTY(ST* st)//判空

void BACK(ST* stfront, ST* strear, char cur[], QU* qu)//回溯

void FORWARD(ST* stfront, ST* strear, char cur[], QU* qu)//前寻

void VISIT(ST* stfront, ST* strear, char cur[], QU* qu)//访问

(3)存储结构

typedef struct stack

{

char s[100][70];

int top;

}ST;//栈定义

typedef struct queue

{

char q[100][70];

int head;

int tail;

}QU;//队列定义,用于接受输出

(4)源代码

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. typedef struct stack
  6. {
  7. char s[100][70];
  8. int top;
  9. }ST;//栈定义
  10. typedef struct queue
  11. {
  12. char q[100][70];
  13. int head;
  14. int tail;
  15. }QU;//队列定义,用于接受输出
  16. void PUSHQ(QU* qu, char cur[])//入队
  17. {
  18. if (qu->tail == 100)
  19. {
  20. printf("队满\n");
  21. }
  22. else
  23. {
  24. qu->tail++;
  25. strcpy_s(qu->q[qu->tail], strlen(cur) + 1, cur);
  26. }
  27. }
  28. void POPQ(QU* qu)//出队
  29. {
  30. qu->head++;
  31. }
  32. void PUSH(ST* st, char cur[])//入栈
  33. {
  34. if (st->top == 100)
  35. {
  36. printf("栈满\n");
  37. }
  38. else
  39. {
  40. strcpy_s(st->s[st->top], strlen(cur) + 1, cur);
  41. st->top++;
  42. }
  43. }
  44. void POP(ST* st)//出栈
  45. {
  46. if (st->top == 0)
  47. {
  48. printf("栈空\n");
  49. }
  50. else
  51. {
  52. st->top--;
  53. }
  54. }
  55. int EMPTY(ST* st)//判空
  56. {
  57. if (st->top == 0)
  58. return 1;
  59. else
  60. return 0;
  61. }
  62. void BACK(ST* stfront, ST* strear, char cur[], QU* qu)//回溯
  63. {
  64. if (!EMPTY(strear))
  65. {
  66. PUSH(stfront, cur);
  67. POP(strear);
  68. strcpy_s(cur, strlen(strear->s[strear->top]) + 1, strear->s[strear->top]);
  69. PUSHQ(qu, cur);
  70. }
  71. else
  72. {
  73. char* a = "Ignored";
  74. PUSHQ(qu, a);
  75. }
  76. }
  77. void FORWARD(ST* stfront, ST* strear, char cur[], QU* qu)//前寻
  78. {
  79. if (!EMPTY(stfront))
  80. {
  81. PUSH(strear, cur);
  82. POP(stfront);
  83. strcpy_s(cur, strlen(stfront->s[stfront->top]) + 1, stfront->s[stfront->top]);
  84. PUSHQ(qu, cur);
  85. }
  86. else
  87. {
  88. char* a = "Ignored";
  89. PUSHQ(qu, a);
  90. }
  91. }
  92. void VISIT(ST* stfront, ST* strear, char cur[], QU* qu)//访问
  93. {
  94. PUSHQ(qu, cur);
  95. stfront->top = 0;
  96. }
  97. int main()
  98. {
  99. printf("输入:\n");
  100. ST stfront;
  101. ST strear;
  102. stfront.top = 0;
  103. strear.top = 0;
  104. QU qu;
  105. qu.head = -1;
  106. qu.tail = -1;
  107. char cur[70];
  108. char start[70] = "http://www.acm.org/";//需先对此网站进行如回溯栈的特殊处理
  109. char in[2][70];
  110. strcpy_s(cur, strlen(start) + 1, start);
  111. scanf_s("%s", in[0], 70);
  112. while (strcmp(in[0], "QUIT") != 0)
  113. {
  114. if (strcmp(in[0], "VISIT") == 0)
  115. {
  116. PUSH(&strear, cur);
  117. scanf_s("%s", in[1], 70);
  118. strcpy_s(cur, strlen(in[1]) + 1, in[1]);
  119. VISIT(&stfront, &strear, cur, &qu);
  120. }
  121. else if (strcmp(in[0], "QUIT") == 0)
  122. {
  123. break;
  124. }
  125. else if (strcmp(in[0], "BACK") == 0)
  126. {
  127. BACK(&stfront, &strear, cur, &qu);
  128. }
  129. else
  130. {
  131. FORWARD(&stfront, &strear, cur, &qu);
  132. }
  133. scanf_s("%s", in[0], 70);
  134. }
  135. printf("输出:\n");//输出
  136. while (qu.head != qu.tail)
  137. {
  138. POPQ(&qu);
  139. printf("%s\n", qu.q[qu.head]);
  140. }

调试分析与测试结果

(1)问题

现象:"const char *" 类型的值不能用于初始化 "char *" 类型的实体。

原因:有些编译器将字符串字面值视为只读常量,如果试图修改它们,将导致运行阶段错误。字符串字面值都将被视为常量,但并不是所有的编译器都对以前的行为做了这样的修改。有些编译器只使用字符串字面值的一个副本来表示程序中所有的该字面值。

方法:打开项目–>属性–>c/c+±->语言–>符合模式–>否,此方法虽然不会报错,但是执行后,无论输入什么,都不会继续下一步操作,并不推荐。最后发现需要将文件类型由.cpp转化为.c文件即可。

(2)运行结果

按书上一些列命令后,得到对应输出结果,并且结果相符合。这里需要输入完命令以后,并输入QUIT之后才会显示所有的输出,而不是输入一项再输出一项,且所有的命令都是大写。

2d206d5b94ac425fac75ab0c6ebb79ec.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/536814
推荐阅读
相关标签
  

闽ICP备14008679号