AcWing第101场周赛 B 栈 题解

这是一个关于栈操作的问题,给定一个初始为空的栈,需要根据一系列字符串操作将其升至栈顶或插入栈顶。最后按照栈的顺序输出所有元素。文章提供了输入输出格式以及示例,并给出了一段C++代码实现,该代码使用结构体和映射处理字符串和它们出现的顺序,然后排序并输出结果。
摘要由CSDN通过智能技术生成

比赛时脑抽了,比完没过5分钟改出来了qwq,写篇题解默哀一下┭┮﹏┭┮

题目描述

给定一个栈,初始时栈为空。

你需要依次进行 n n n 个操作。

每个操作给定一个由小写字母构成的非空字符串,随后进行判断:

  • 如果栈中已经包含该字符串,则将该字符串上升至栈顶,栈中其它元素的相对顺序保持不变。
  • 如果栈中还未包含该字符串,则将该字符串直接插入到栈的顶部。

所有操作完成后,请你按照从栈顶到栈底的顺序,依次输出栈内所有元素。

输入格式

第一行包含整数 n n n

接下来 n n n 行,每行包含一个由小写字母构成的非空字符串。

输出格式

按照从栈顶到栈底的顺序,依次输出栈内所有元素。

每个元素占一行。

数据范围

5 5 5 个测试点满足 1 ≤ n ≤ 10 1 \le n \le 10 1n10
所有测试点满足 1 ≤ n ≤ 2 × 1 0 5 1 \le n \le 2 \times 10^5 1n2×105,每个给定字符串的长度范围 [ 1 , 10 ] [1,10] [1,10]

输入样例1:
4
apple
pear
banana
pear
输出样例1:
banana
apple
输入样例2:
8
pen
book
eraser
desk
desk
eraser
book
pen
输出样例2:
book
eraser
desk
注释代码
#include <bits/stdc++.h>

using namespace std;

struct Node {	//	存map里的数据,方便排序和遍历
    int id;
    string val;
} node[200010];

int n;
map<string, int> mp;

bool cmp(Node a, Node b) {
    return a.id < b.id;
}

int main() {
    scanf("%d", &n);
    
    for (int i = 1; i <= n; ++ i ) {
        string s;
        cin >> s;
        bool b = mp.count(s);
        if (b) {
            mp[s] = i;
            ++ tot ;
        } else mp.insert(pair<string, int>(s, i));
    }
    
    int tot = 0;
    for (auto it = mp.rbegin(); it != mp.rend(); ++ it ) {	//	将map的数据存到结构体中
        node[ ++ tot ].val = it -> first;
        node[tot].id = it -> second;
    }
    
    sort(node + 1, node + 1 + tot, cmp);	//	对结构体的下标进行排序
    
    for (int i = tot; i >= 1; -- i ) cout << node[i].val << endl;	//	倒序输出即可
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值