Advertisement

上海计算机学会2020年3月月赛C++乙组T1浏览器

阅读量:

题目描述

所有的网页浏览器都有访问、前进与后退按钮,它们的工作原理如下:

  1. 用户在进行"访问"操作时需提供一个具体的网址,在线浏览完成后将该页面设为当前页面,并将其直接导航目标设为跳转之前的页面;
  2. 当执行"后退"操作时, 系统会检查当前所在的网页是否有后续链接, 如果存在则会前往该后续链接所在的页面;
  3. "前进"行为主要用于撤销刚执行过的"后退"动作:
    • 如果上一步是"后退"行为, 则会返回到"后退"之前所在的页面;
    • 如果上一步是"访问"行为, 则此条"前进"指令将被忽略;
    • 如果上一步同样是执行了几次连续的"前进", 需要判断此次是否已经撤销了一个先前的"后退":如果是的话, 则按照之前的记录继续处理;否则则忽略这次执行的行为。

基于给定的 n 条操作,请您请求浏览器模拟其行为,并输出每次操作对应的网址。

输入格式

第一行:单个正整数 n 表示操作数量;
接下来 n 行:每行表示一步操作,

登录系统时,请确保链接以字母 v 开始,并且不允许存在空白或其他不可见字符。

  1. 后退 仅有一个字母 b
  2. 前进 仅有一个字母 f

输出格式

共 n 行:对每一步操作,

  • 当浏览器访问某个指定的URL时,请返回该URL;
  • 若浏览器未执行此操作,请返回问号符号。

数据范围

保证每个输入的网址长度不会超过 3030;

  • 对于 30% 的数据,1≤n≤1000;
  • 对于 60% 的数据,1≤n≤10000;
  • 对于 100% 的数据,1≤n≤50000。

样例数据

输入:
10
v iai.sh.cn
v scs.sh.cn
v yacs.club
b
b
f
f
f
v ioinformatics.org
f
输出:
iai.sh.cn
scs.sh.cn
yacs.club
scs.sh.cn
iai.sh.cn
scs.sh.cn
yacs.club
?
ioinformatics.org
?
输入:
8
v iai.sh.cn
v taobao.com
v baidu.com
b
b
v tmall.com
f
b
输出:
iai.sh.cn
taobao.com
baidu.com
taobao.com
iai.sh.cn
tmall.com
?
iai.sh.cn

通过采用string数组的方式进行操作,并将详细内容可参考代码部分

复制代码
 #include <bits/stdc++.h>

    
 using namespace std;
    
 string a[50005];
    
 int p;
    
 int main() {
    
     int n;
    
     int limit = 1;
    
     cin >> n;
    
     p = 1;
    
     for (int i = 1; i <= n; i++) {
    
     char c;
    
     cin >> c;
    
     if (c == 'v') {
    
         p++;
    
         cin >> a[p];
    
         limit = p;
    
         cout << a[p] << endl;
    
     } else if (c == 'b') {
    
         if (p <= 2) {
    
             cout << "?" << endl;
    
         } else {
    
             p--;
    
             cout << a[p] << endl;
    
         }
    
     } else if (c == 'f') {
    
         if (p >= limit) {
    
             cout << "?" << endl;
    
         } else {
    
             p++;
    
             cout << a[p] << endl;
    
         }
    
     }
    
     }
    
     return 0;
    
 }

也可以采用两个栈来模拟:

详见代码:

复制代码
 #include <bits/stdc++.h>

    
 using namespace std;
    
 stack <string> q;//前继
    
 stack <string> h;//后继
    
 int n;
    
 string c;
    
 int main() {
    
     cin >> n;
    
     while (n--) {
    
     char op;
    
     cin >> op;
    
     if (op == 'v') {//浏览
    
         cin >> c;
    
         while (!h.empty()) {//清空后继
    
             h.pop();
    
         }
    
         q.push(c);//压入前继
    
         cout << c << endl;//直接输出
    
     } else if (op == 'b') {//后退
    
         if (q.size() >= 2) {//有前继
    
             c = q.top();//弹出当前网站
    
             q.pop();
    
             cout << q.top() << endl;//输出前继
    
             h.push(c);//压入后继
    
         } else {
    
             cout << "?" << endl;//无前继,输出问号
    
         }
    
     } else if (op == 'f') {//前进
    
         if (!h.empty()) {//如果有后继
    
             cout << h.top() << endl;//输出
    
             c = h.top();//弹出后继
    
             h.pop();
    
             q.push(c);//压入前继
    
         } else {
    
             cout << "?" << endl;//没有后继,输出问号
    
         }
    
     }
    
     }
    
     return 0;
    
 }

全部评论 (0)

还没有任何评论哟~