浙大版《数据结构学习与实验指导(第2版)》进阶实验8-2.2:特殊堆栈

简介: 浙大版《数据结构学习与实验指导(第2版)》进阶实验8-2.2:特殊堆栈

题意

Description

堆栈是一种经典的后进先出的线性结构,通常有入栈(Push)和出栈(Pop)两个操作。


某人觉得这样不够好玩,就自己模拟了一个栈,并加上了取中值(GetMedia)操作。


即,返回(不取出)栈中所有元素的最中间那个元素。若最中间的元素有两个,则返回更靠前的那个。


Input

输入包括很多行(行数 $\le 10^5$),每行都是一个操作。


如果操作命令是Push,则后面会紧跟一个空格和数字$t$ ( $0 \le t\le 10^5$ ),表示要把$t$入栈。如:Push 3。


如果操作命令是Pop,则此行它后面什么都不会出现,表示要出栈一个元素。


如果操作命令是GetMedia,则此行它后面什么都不会出现,表示要返回栈中最中间的那个数。


数据保证每个操作命令不包含空格,即不会出现操作Get Media等。


Output

符合上述3种描述的输入都是合法输入,但不一定是合法操作。例如在栈空时尝试Pop命令就是非法的。


如果是Push命令,就把它后面的整数入栈。


如果是Pop命令,就出栈一个元素并输出。


如果是GetMedia命令,就输出中间的元素。


操作过程中若出现任何非法情况,则这个操作取消并输出What are you Nong Sha Li?。

思路

比较简单的思路就是用数组进行模拟,要注意对非法情况的判断。

还有一种思路就是维护一个栈和一个vector容器


有点思维的题。在动态求中位数时,一般都是用对顶堆维护。但是对顶堆的删除操作不容易实现。

先考虑暴力的做法,是维护一个栈和一个vector容器,每次询问时都对vector进行sort,这样复杂度是O ( n 2 )

如果在插入的时候就保持vector的有序,每次查询时都二分查找该数在有序列表中的位置,时间复杂度就降到了O ( n l o g n + c )

详见

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+100;
int a[maxn],idx;
int main(){
    string op;
    while(cin>>op){
        if(op=="Pop"){
            if(idx<=0) puts("What are you Nong Sha Li?");
            else{
                idx--;
                cout<<a[idx]<<endl;
            }
        }
        else if(op=="Push"){
            int x;cin>>x;
            a[idx++]=x;
        }
        else if(op=="GetMedia") {
            if(idx<=0) puts("What are you Nong Sha Li?");
            else{
                cout<<a[(idx-1)/2]<<endl;
            }
        }
        else puts("What are you Nong Sha Li?");
    }
    return 0;
}
目录
相关文章
|
3月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
74 1
|
3月前
|
存储 算法 数据安全/隐私保护
【Python学习篇】Python实验小练习——高级数据结构(五)
【Python学习篇】Python实验小练习——高级数据结构(五)
55 1
|
3月前
|
存储 消息中间件 缓存
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
77 0
|
3月前
|
存储 算法 数据挖掘
数据结构实验||约瑟夫环
数据结构实验||约瑟夫环
|
3月前
|
存储 NoSQL 安全
Redis系列学习文章分享---第十五篇(Redis最佳实践--设计优雅的key+合适的数据结构+持久化如何配置+慢查询问题解决)
Redis系列学习文章分享---第十五篇(Redis最佳实践--设计优雅的key+合适的数据结构+持久化如何配置+慢查询问题解决)
65 1
|
3月前
|
存储 算法 程序员
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
43 4
|
2月前
|
Dart 算法 JavaScript
C#数据结构与算法入门教程,值得收藏学习!
C#数据结构与算法入门教程,值得收藏学习!
|
3月前
|
存储 算法 C语言
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
59 1
|
2天前
|
存储
|
17天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。