CStack.h:

#pragma once

class CStackElement
{
public:
CStackElement(void){}
CStackElement(int data, int min=0)
{
m_nData = data;
m_nMin = min;
} ~CStackElement(void){} public:
int m_nData;
int m_nMin;
}; class CStack
{
public:
CStack(int maxSize);//普通构造函数,构造一个大小为maxSize的栈
CStack(const CStack &stack);//拷贝构造函数
CStack & operator=(const CStack &stack);//赋值函数
~CStack(void); void Push(int nPushElement);//向栈中压入一个元素nElement
void Pop();//从栈中弹出一个元素,并返回
int Min();//O(1)的时间返回最小元素值 private:
CStackElement *m_pStackArr;
int m_top;//指向栈顶元素的下一个位置
int m_nMaxSize;
};

CStack.cpp:

#include "StdAfx.h"
#include "CStack.h"
#include <iostream>
using namespace std; //普通构造函数,构造一个大小为maxSize的栈
CStack::CStack(int maxSize)
{
m_top = 0;//指向栈顶元素的下一个位置
m_nMaxSize = maxSize;
m_pStackArr = new CStackElement[m_nMaxSize];
} //拷贝构造函数
CStack::CStack(const CStack &stack)
{
m_top = stack.m_top;
m_nMaxSize = stack.m_nMaxSize;
m_pStackArr = new CStackElement[m_nMaxSize];
memcpy(m_pStackArr, stack.m_pStackArr, m_nMaxSize);
} //赋值函数
CStack & CStack::operator=(const CStack &stack)
{
if (this == &stack)//自赋值检查
{
return *this;
} if (stack.m_top != 0)//stack为空
{
if (m_nMaxSize < stack.m_nMaxSize)
{
m_nMaxSize = stack.m_nMaxSize;
delete [] m_pStackArr;
m_pStackArr = new CStackElement[m_nMaxSize];
memcpy(m_pStackArr, stack.m_pStackArr, m_nMaxSize);
}
}
return *this;
} //向栈中压入一个元素nElement
void CStack::Push(int nPushElement)
{
if (m_top == m_nMaxSize)
{
cout << "栈满!" << endl;
}
else if (m_top == 0)//栈空
{
m_pStackArr[m_top++].m_nData = nPushElement;
m_pStackArr[m_top++].m_nMin = nPushElement;
cout << "压入" << nPushElement<< endl;
}
else
{
if (m_pStackArr[m_top-1].m_nMin > nPushElement)
{
m_pStackArr[m_top].m_nMin = nPushElement;
}
else
{
m_pStackArr[m_top].m_nMin = m_pStackArr[m_top-1].m_nMin;
} m_pStackArr[m_top++].m_nData= nPushElement;
cout << "压入" << nPushElement<< endl;
}
} //从栈中弹出一个元素,并返回
void CStack::Pop()
{
int nPopElement = 0;
if (m_top == 0)
{
nPopElement = -1;
cout << "栈空!" << endl;
}
else
{
nPopElement = m_pStackArr[--m_top].m_nData;
cout << "弹出" << nPopElement << endl;
}
} //O(1)的时间返回最小元素值
int CStack::Min()
{
if (m_top == 0)
{
cout << "栈空!" << endl;
return -1;
}
else
{
return m_pStackArr[m_top-1].m_nMin;
}
} CStack::~CStack(void)
{ }

测试代码:

// 栈和队列的灵活应用一:包含min,max函数的栈.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include "CStack.h"
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
CStack stack(20);
stack.Push(4);
cout << "Min: " << stack.Min() << endl; stack.Push(5);
cout << "Min: " << stack.Min() << endl; stack.Push(2);
cout << "Min: " << stack.Min() << endl; stack.Pop();
cout << "Min: " << stack.Min() << endl; stack.Push(3);
cout << "Min: " << stack.Min() << endl; system("pause");
return 0;
}

面试题19:包含min函数的栈的更多相关文章

  1. 剑指Offer面试题:19.包含Min函数的栈

    一.题目:包含Min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 这里我们要实现的就是min ...

  2. 《剑指offer》面试题21 包含min函数的栈 Java版

    (min函数的作用是返回栈内最小值) 首先这个栈要具有普通栈所具有的push()和pop()方法,那么内部一定包含一个Stack.至于还要能实现min函数,而且还是在O(1)时间复杂度内,我们不得不考 ...

  3. 剑指Offer:面试题21——包含min函数的栈(java实现)

    问题描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push及pop的时间复杂度都是O(1). 思路:加入一个辅助栈用来存储最小值集合 (这里要注 ...

  4. 剑指offer-面试题21.包含min函数的栈

    题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数. 在该栈中,调用min,push及pop的时间复杂度都是O(1). 这一题实际上需要一个辅助栈存储最小值: 1.在模板类定 ...

  5. 《剑指offer》面试题21—包含min函数的栈

    题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数min.要求push,min,pop时间都是O(1). 思路:要用一个辅助栈,每次有新元素压栈时辅助栈压入当前最小元素:min函数直 ...

  6. 19 包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数.   思路:一个栈存普通元素,一个最小栈存放目前位置最小的元素,只在压入的时候判断是否为空以及最小元素,其他情况正常处理 ...

  7. 《剑指offer》面试题30. 包含min函数的栈

    问题描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1).   示例: MinStack minSt ...

  8. 剑指offer面试题30.包含min函数的栈

    一开始写的垃圾代码,push和pop都是O(N) class Solution { public: vector<int> vec; int min_val=INT_MAX,min_cnt ...

  9. 【面试题021】包含min函数的栈

    [面试题021]包含min函数的栈  MinStack.cpp: 1234567891011121314151617181920212223242526272829303132333435363738 ...

  10. 剑指offer——面试题30:包含min函数的栈

    #include"iostream" #include"stdio.h" using namespace std; ; ; template<typena ...

随机推荐

  1. Android 更好的Activity生命周期回调

    /** * This class allows you to listen to when the user is entering the background (i.e. after a home ...

  2. 搞了一个独立博客,请各位光临pingworld.cn

    嘿嘿,每次在一个大网站上建立自己的博客后总是没有动力持续更新下去,回想其原因很大是因为没有一个自己的地盘,懒得维护!还有一个原因就是自己也没有什么干货值得跟大家分享. 随着工作的时日见长,有了各种各样 ...

  3. FAQ:Python 断点调试

    Python程序调试:断点调试是必须有的功能,以Pycharm开发工具为例: 一.理论知识: 1. step into(F7)就是单步执行,遇到子函数就进入并且继续单步执行: 2  step over ...

  4. 项目关联不上开源项目(library)

    首先是add library的时候重新打开始始终显示关联错误,在reference中出现一个红叉,无论如何都解决不了,remove后重新添加也会有这个问题,Eclipse也没有任何出错提示. 最后在h ...

  5. CF卡是什么

    CF卡(Compact Flash)最初是一种用于便携式电子设备的数据存储设备.作为一种存储设备,它革命性的使用了闪存,于1994年首次由SanDisk公司生产并制定了相关规范.当前,它的物理格式已经 ...

  6. git忽略特殊文件

    忽略特殊文件 有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症 ...

  7. powerdesigner for sqlserver的一些实用配置

    在实用powerdesigner生成sqlserver 数据表时常常遇到一些问题: 1.数据中定义的字段名称相同生成物理模型时会报错. 2.数据各表之间的主键不能定义一样的名称. 我现在的需求是将数据 ...

  8. 链表-Add Two Numbers

    第一版代码(很挫很罗嗦,不过是第一次做,记录一下成长的脚步!继续努力!) /*struct ListNode { int val; struct ListNode *next; };*/ typede ...

  9. 前端web应用的组件化(二) 徐飞

    Web应用的组件化(二) https://github.com/xufei/blog/issues/7 管控平台 在上一篇中我们提到了组件化的大致思路,这一篇主要讲述在这么做之后,我们需要哪些外围手段 ...

  10. SurfaceView 和 View 区别

    android.view.View 和 android.view.SurfaceView SurfaceView 是从 View 基类中派生出来的显示类,直接子类有 GLSurfaceView和Vid ...