设计一个有getMin功能的栈
【说明】:
本文是左程云老师所著的《程序员面试代码指南》第一章中“设计一个有getMin功能的栈”这一题目的C++复现。
本文只包含问题描述、C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书。
感谢左程云老师的支持。
【题目】:
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
【要求】:
1、pop、push、getMin操作的时间复杂度都是O(1)。
2、设计的栈类型可以使用现成的栈结构。
【思路】:
以空间换时间:总体设计上采用两个栈,一个栈保存元素,另一个栈保存每一步的最小值。
【编译环境】:
CentOS6.7(x86_64)
gcc 4.4.7
【实现】:
1、声明代码
/*
*文件名:
*作者:Stan
*摘要:设计一个具有O(1)复杂度的栈,并实现其基本操作
*/ #ifndef _GETMINSTACK_H
#define _GETMINSTACK_H
#include <stack>
using namespace std; class MyStack
{
public:
MyStack(){};
~MyStack(){};
void push(int data);
void pop();
int top();
int getMin();
bool empty();
private:
stack<int> sData;
stack<int> sMin; }; #endif
2、实现代码
/*
*文件名:
*作者:Stan
*摘要:MyStack.h中声明的实现
*/ #include "getMinStack.h"
#include <stdexcept>
#include <exception>
void MyStack::push(int data)
{
if(sMin.empty())
sMin.push(data);
else if(data < sMin.top())
sMin.push(data);
else
sMin.push(sMin.top());
sData.push(data);
return ;
} void MyStack::pop()
{
if(sData.empty())
throw runtime_error("Empty Stack!");
sMin.pop();
sData.pop();
} int MyStack::top()
{
if(sData.empty())
throw runtime_error("Empty Stack!");
return sData.top();
} int MyStack::getMin()
{
if(sMin.empty())
throw runtime_error("Empty Stack!");
return sMin.top();
} bool MyStack::empty()
{
if(sData.empty())
return true;
else
return false;
}
3、测试代码
/*
*文件名:
*作者:Stan
*摘要:测试函数
*/ #include "getMinStack.h"
#include <iostream>
using namespace std; int main()
{
int a[]={,,,,,};
MyStack s;
for(int i=;i<;i++)
{
s.push(a[i]);
cout << "s.top():" << s.top() << endl;
cout << "s.getMin():" << s.getMin() << endl;
}
cout << "The datum in the stack is:" << endl;
while (!s.empty())
{
cout << s.top() << endl;
s.pop();
}
return ;
}
注:
转载请注明出处;
转载请注明源思路来自于左程云老师的《程序员代码面试指南》。
设计一个有getMin功能的栈的更多相关文章
- 算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈
刚入手了一本<程序员代码面试指南>,书中题目的代码都是 Java 实现的,琢磨着把这些代码用 PHP 敲一遍,加深印象. 题目:设计一个有 getMin 功能的栈 —— 实现一个特殊的栈, ...
- 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈
题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ...
- 栈和队列----设计一个有getMin功能的栈
设计一个有getMin功能的栈 设计一个具有getMin功能的栈,可以返回栈中的最小的元素,可以使用现有的栈的数据结构,要求pop/push/getMin操作的时间复杂度是O(1). package ...
- 栈和队列问题:设计一个有 getMin 功能的栈
[知识点] 栈是一个先进后出(FILO-First In Last Out)的数据结构,队列是一种先进先出(FIFO-First In First Out)的数据结构. [题目] 实现一个特殊的栈,在 ...
- 设计一个有getMin功能的栈(2)
题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ...
- 设计一个有getMin功能的栈(1)
题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ...
- 常见面试算法题JS实现-设计一个有getMin功能的栈
前言: 已经确定工作了-下周一正式入职,按理说应该是可以好好浪荡一周的,但是内心总是不安,总觉得自己这个水平真的太菜了,还是趁着现在有自己的时间,赶紧多看看书,多学习学习吧orz所以把之前校招买的书, ...
- 左神算法书籍《程序员代码面试指南》——1_01设计一个有getMin功能的栈
[题目] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. [要求] 1.pop.push.getMin操作的时间复杂度都是O(1).2.设计的栈类型可以使用现成的栈结构. ...
- 设计一个带有getmin功能的栈,保证时间复杂度在O(1)
2017-06-22 20:56:10 需要得到最小值,最简单的思路就是遍历一遍求出最小值.但是这样的时间复杂度会是O(n),不满足O(1)的要求.于是想到在建立一个栈来保存最小值. 具体操作是建立 ...
随机推荐
- SQLServer2012 和 MariaDB 10.0.3 分页效率的对比
1. 实验环境 R910服务器, 16G内存 SqlServer 2012 64bit MariaDB 10.0.3 64bit (InnoDB) 2. 实验表情况 rtlBill ...
- Linux的正常关机
Azure上的 IaaS 虚拟机可使用多种方式关闭,例如通过 Azure 管理门户.Azure Powershell cmdlet 或 CLI 工具,甚至还可以由交互式登录的用户关闭.Azure 平台 ...
- poj2013---二维数组指针使用
#include <stdio.h> #include <stdlib.h> #include<string.h> int main() { ; ][],arr2[ ...
- swig模板下拉框应用
<div class="form-group"> <label><span class="fa fa-asterisk red"& ...
- 深度学习工具caffe具体安装指南
caffe安装指南-吐血整理 前言: 在一台系统环境较好的linux机器上能够非常easy的安装caffe,可是假设系统本身非常旧,又没有GPU的话.安装就太麻烦了,全部都得从头做起,本文档旨在尽可能 ...
- MySQL学习笔记(3)
约束 作用:保证数据的完整性,唯一性 根据字段:分为表级约束(针对2个或者2个以上字段使用),列级约束(针对1个字段使用) 约束类型:NOT NULL 非空约束 PRIMARY KEY 主键约束 U ...
- Memcached基础
1.实例化 MemcachedClient client = new XMemcachedClient(); public XMemcachedClient() public XMemcachedCl ...
- Git基本应用
1.创建SSH Key $ cd ~/.ssh $ ssh-keygen -t rsa -C "your_email@example.com" 拷贝id_rsa.pub文件到Set ...
- mysql之数据库特性认识
最近面试经常被面试官问道关于数据库方面的知识,于是总结一下面试官问的题以及自己对数据库的认识 1.之前百度面试官问了我一个特别基础的sql问题:如何清除表的所有记录,以前在学校做项目开发的时候有使用过 ...
- JAVA 语 言 如 何 进 行 异 常 处 理 , 关 键 字 : throws,throw,try,catch,final
throws是获取异常throw是抛出异常try是将会发生异常的语句括起来,从而进行异常的处理,catch是如果有异常就会执行他里面的语句,而finally不论是否有异常都会进行执行的语句.