今天做了一下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;
}

运行结果

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

  1. 笔试题之——栈问题(列车车厢编组问题)

    滴!又是一个笔试题总结! 1.题目说明: 铁路货车编组站如图显示,A点有K节车厢,所有车厢都须从A点进入,经C点道岔后,重新编组到B点. 如:A点有车厢1-2-3(左-右),经C编组,到B点后,可以被 ...

  2. 每天一算法(二)实现栈的push pop 操作,并可以输出栈的最小值

    实现栈的push pop 操作,并可以输出栈的最小值 // SatckMin.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include ...

  3. 29. 栈的push,pop序列

    题目:给定2个整数序列,其中1个是栈的push顺序,判断另一个有没有可能是对应的pop顺序 解:其实这题主要是判断进栈次数和出栈次数誓不是相等.我是用栈作的,效率不高,每一个元素最多出栈1次,进栈1此 ...

  4. 汇编自动出栈_汇编自学 (12) 重温进出栈指令PUSH POP 和双循环

    微软的masm5.0是8位平台的,6.0是16位平台的,还有其他32位平台的.现在编程一般用32位平台,8位和16位都可以在保护模式运行. 最简单的一个程序 assume cs: codesg cod ...

  5. 【Android 逆向】x86 汇编 ( push / pop 入栈 / 出栈 指令 | ret / retn 函数调用返回指令 | set 设置目标值指令 )

    文章目录 一.push / pop 入栈 / 出栈 指令 二.ret / retn 函数调用返回指令 三.set 设置目标值指令 总结 一.push / pop 入栈 / 出栈 指令 push / p ...

  6. C++初级程序员笔试题总结

    转行码农一年多了,也经历过许多笔试面试,好好总结一下C++初级程序员笔试常见的问题,供大家参考,不足之处请大家补充,有什么问题也可留言. 也算列个提纲,后续逐一来填坑. 适用对象:初级程序员. 以下顺 ...

  7. 程序员面试题精选100题(24)-栈的push、pop序列[数据结构]

    题目:输入两个整数序列.其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序.为了简单起见,我们假设 push 序列的任意两个整数都是不相等的. 比如输入的push序列 ...

  8. 程序员面试题精选(24):栈的push、pop序列

    题目:输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2.3 ...

  9. 栈的push、pop序列-判断序列是否是栈的pop顺序

    程序员面试题精选100题(24)-栈的push.pop序列[数据结构] 题目:输入两个整数序列.其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序.为了简单起见,我们 ...

最新文章

  1. 多传感器融合:自动驾驶(上)
  2. storyboard和xib的区别
  3. 【转】Itween 贝塞尔曲线(一)
  4. Altium Designer -- PCB布局与布线
  5. CPU Cache对于并发编程的影响
  6. 解读 Knative Eventing v0.10.0 最新版本特性
  7. c语言xuanzeti1,c语言选择题库1
  8. 计算机验收标准和验收方法,【超详细】综合布线系统验收标准及内容
  9. 解决QQ邮箱接收不到Stream邮件问题
  10. grok java_ELK实战 - Grok简易入门
  11. 操作系统与计算机组织基本知识(一)
  12. kafka-生产者使用
  13. 基于DRM框架的HDMI热插拔流程分析
  14. 蚂蚁金服分布式链路组件 SOFATracer 埋点机制解析 | SOFAChannel#15 直播整理
  15. 2022年前端面试题总结
  16. 电机控制编程的数学运算优化方案
  17. iperf3 网络测速工具 —— 筑梦之路
  18. Python爬虫——Cookie模拟登录
  19. Vue实现简单聊天对话框案例
  20. 什么是SOA?什么是ESB?及其在银行业中是如何发展的?

热门文章

  1. Python3.5-20190501-廖老师的
  2. Android学习(七)—— Android布局
  3. 关于代码手写UI,xib和StoryBoard
  4. echo 12345678 | base64 产生的结果跟12345678真正的base64编码不对
  5. .Net Remoting(基本操作) - Part.2 (转)
  6. 想起温习一下JS中的this apply call arguments
  7. new失败跟踪函数_WinDbg预览时间线:调试器中的时间线可以允许用户记录跟踪
  8. ldap统一用户认证php,针对LDAP服务器进行身份认证
  9. mysql添加字符串日期时间_mysql学习笔记--- 字符串函数、日期时间函数
  10. 前端请求接口post_前端如何优雅地模拟接口请求?(给你的代码加点小意外)