[WPS笔试题]实现栈的push,pop,max且时间复杂度为O(1)

今天做了一下WPS的笔试题,遇到了一道关于栈的题,觉得挺有意思的,就写篇博客分享一下吧~~

题目要求:要求实现栈的数据结构,在该类型中实现一个能够得到栈的最大元素的max函数,在该栈中,调用max,push,pop的时间复杂度是O(1).

解题思路:我们首先会想到的大概是,找最大元素不就排个序,直接取栈顶的元素不就好了吗。可是这时,我们就把这个入栈的顺序修改了。这并不是我们想要的。在不改变入栈顺序的情况下,我们只能用一个辅助栈来解决这一类问题。

此时,我们可以将最大的元素放到这个辅助栈中,取辅助栈的栈顶元素就ok了。问题来了?

如何给辅助栈中放最大元素???

这里分为以下几种情况:

  1. 我们先往数据栈中放元素,当辅助栈为空时,直接将数据栈中的元素放入辅助栈中
  2. 当辅助栈中有数据时,我们需要比较将要入栈的数据是否大于当前辅助栈中的数据,如果大于则继续往辅助栈中放数据,否则放入当前辅助栈中的数据(这里用的比较巧妙,是为了寻找次大的数据,当pop出数据后,仍然可以找到次大的数据

最终解题思路

这里写图片描述

代码实现

由于自己考虑到了string类的特殊情况,里边还使用了仿函数的形式,实现了简单的模板类。
#include<iostream>
using namespace std;
#include<stack>
#include<assert.h>
#include<string>template<class T>
struct Less
{bool operator()(const T& left,const T& right){return left < right;}
};template<class T>
struct Greater
{bool operator()(const T& left,const T& right){return left >= right;}
};template<class T,class Compare>
class StackWithMax
{
public:void Push(const T& data);void Pop();T& MaxValue();private:stack<T> value_st;stack<T> max_st;
};template<class T,class Compare>
void StackWithMax<T,Compare>::Push(const T& data)
{value_st.push(data);if(max_st.size() == 0 || Compare()(data,max_st.top()))max_st.push(data);elsemax_st.push(max_st.top());
}template<class T,class Compare>
void StackWithMax<T,Compare>::Pop()
{assert(value_st.size() >= 0 && max_st.size() >= 0);max_st.pop();value_st.pop();
}
template<class T,class Compare>
T& StackWithMax<T,Compare>::MaxValue()
{assert(value_st.size() >= 0 && max_st.size() >= 0);return max_st.top();
}

测试代码

int main()
{StackWithMax<int,Greater<int>> st;st.Push(3);st.Push(4);st.Push(2);st.Push(1);st.Push(4);cout<<st.MaxValue()<<endl;st.Pop();cout<<st.MaxValue()<<endl;StackWithMax<string,Greater<string>> st1;st1.Push("aaa");st1.Push("bbb");st1.Push("ccc");st1.Push("fff");st1.Push("eee");cout<<st1.MaxValue()<<endl;st1.Pop();cout<<st1.MaxValue()<<endl;return 0;
}

运行结果

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MarkDown生成目录索引

123 在第一行开头写[TOC] 必须是第一行&#xff0c;不可以在前面加别的东西。 1 2 3

ubuntu 如何用root身份进行登录

公司有个小项目, 需要用python调用 sh脚本来执行一些东西, 执行脚本的时候需要输入密码 类似 sudo S paaswd 脚本, 但是给客户部署的话, 再让客户客户 保存密码到配置文件, 就显得麻烦, 就想到用root方式去登陆系统, 结果用了网上的方法, 还是登陆不进去, 最后结合简书的一个方…

[剑指Offer]替换空格

今天看题的时候&#xff0c;遇到一个替换空格的题目&#xff0c;分析一下哈。 题目要求&#xff1a;把字符串中的每个空格替换成“%20”。例如输入“we are happy”&#xff0c;则输出“we%20are%20happy”。 解题思路&#xff1a;我们首先想到的是&#xff1a;移位思想。遇到…

C语言关键字 ISO/ANSI C90 C99 C11

面试考点 https://blog.csdn.net/csdn_kou/article/details/81113215 * 有的常用的我们都不知道是关键字&#xff0c;比如sizeof.这是面试中的考点&#xff0c;要注意。 * 同时当回答C语言中有多少关键字时&#xff0c;要回答前题条件&#xff0c;时针对哪一个版本

vm15 安装 mac虚拟机的过程 转载的

https://blog.csdn.net/weixin_43299649/article/details/82881567

task_struct解析

task_struct是Linux内核的一种数据结构&#xff0c;它用task_struct结构体来描述进程的信息。下面来剖析一下进程中保存的主要的信息有哪些&#xff1f; struct task_struct {//进程的运行时状态volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */void …

ubuntu上有个小项目 ,需要调用xx.sh脚本, 出现无法识别 某些环境变量的解决办法,仅供参考

项目是用python 调用 同事写好的 xx.sh脚本&#xff0c; 在手动调用的时候 发现能正常调用&#xff0c; 当用python代码的时候&#xff0c; 就不行了&#xff0c; 通过日志发现&#xff0c; python调用的时候 不识别 ADNROID_NDK这个环境变量&#xff0c; 在python中 我是通过&…

关于sudo

之前&#xff0c;我们使用sudo的时候&#xff0c;是因为其用户本身具有root权限&#xff0c;所以可以sudo后执行相关操作&#xff0c;但是对于普通用户来说&#xff0c;它是既不具有sudo权限&#xff0c;又不在sudo用户组中&#xff0c;那么我们来研究一下如何将新创建的用户添…

在使用 python 封装的进程池 from concurrent.futures import ProcessPoolExecutor 遇到的问题

在ubuntu中&#xff0c;用的是python3.5 executeprebuildpath ExecutePrebuild()processpool ProcessPoolExecutor(1)processpool.submit(executeprebuildpath.run).add_done_callback(self.precallback)processpool.shutdown(waitFalse)self.runsign Trueself.runningprebu…

对pthread_create未定义的引用

pthread库不是Linux系统默认的库&#xff0c;连接时需要使用库libpthread.a,在编译中要加-lpthread [koulocalhost practive]$ gcc creat.c /tmp/ccPULtaF.o&#xff1a;在函数‘main’中&#xff1a; creat.c:(.text0x58)&#xff1a;对‘pthread_create’未定义的引用 coll…

Bash入门

Bash简介&#xff1a; Bash&#xff08;GNU Bourne-Again Shell&#xff09;是一个为GNU计划编写的Unix shell&#xff0c;它是许多Linux平台默认使用的shell。 shell是一个命令解释器&#xff0c;是介于操作系统内核与用户之间的一个绝缘层。准确地说&#xff0c;它也是能力…

ubuntu 设置分辨率 亲测可用 转载的

网上试了很多方法, 这家管用 https://blog.csdn.net/qq_35661436/article/details/72802040

线程之售票系统pthread_mutex,_lock,_unlock

先看一下这篇文章 https://blog.csdn.net/csdn_kou/article/details/81148268 四个人同时买票票&#xff0c;引出线程 #include "head.h" int ticket 100; void * route(void *arg) {char *id (char *)arg;while(1){if(ticket>0){usleep(1000);printf("…

Bash基本语法

1. 变量赋值 a375 hello$a 这里需要注意的是&#xff0c;等号两边不能有空格 还有一个例子是这样的 例1&#xff1a; 结果为&#xff1a; 关于上述&#xff0c;主要有如下几点&#xff1a; $hello和${hello}是一样的&#xff0c;在bash中如果遇到空格&#xff0c;tab键时&a…

windows下 , py运用了 进程池, 将py打包成exe,出现错误的 解决思路之一

在windows上,用pycharm开发了一个小项目, 用到了from concurrent.futures import ProcessPoolExecutor 本来在pycharm里面,运行的好好地, 可是打包成exe的时候, 发现 当程序运行到 进程池执行任务的时候,会创建一个新的界面, 猜测应该是创建了一个新的进程, 百度后,发现在 程序…

关于fd和fp(fd:file descirptor fp:file pointor)

通常&#xff0c;我们在输入数据或输出数据的设备为键盘或者显示器。当然&#xff0c;我们比较熟悉的输入输出&#xff0c;可能就是对于文件的操作&#xff0c;还有直接从终端输出&#xff0c;显示到显示器上。在C语言中&#xff0c;我们使用fopen,fclose,fread,fwrite对文件进…

粗谈pragma once与 #ifndef的区别

#ifnde不受编译器的任何限制&#xff1b; #pragma once不受一些较老的编译器支持&#xff0c;兼容性不够好

在mac os10.13系统下 ,将py文件打包成可执行程序后, 里面的路径出现的问题

本来 用命令行运行py文件, 代码里面 获取当前路径的 语句 例如: os.getcwd() os.path.abspath(__file__) os.path.realpath(__file__)都可以获取到当前文件的路径, 但是打包成 可执行程序后, 统统不对了, 变成了 类似 /usr/xxx 的路径 https://stackoverflow.com/questions/50…

[linux]wait详解

wait&#xff1a;进程等待 主要有两种等待方式&#xff1a;阻塞式等待和非阻塞式等待 阻塞式等待&#xff1a;如果子进程正在运行&#xff0c;父进程将会一直等待着子进程运行结束&#xff0c;并且自己什么事都不干 非阻塞式等待&#xff1a;如果子进程正在运行&#xff0c;…