2、设计包含min 函数的栈

 2.设计包含min 函数的栈。
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
要求函数min、push 以及pop 的时间复杂度都是O(1)。

 

思路:
 1、min,push,pop都需要时间复杂度为O(1), 所以树,堆等数据结构都不能用

 2、栈只有通过push来添加元素,pop来删除元素,min操作只是获取元素数据,并不进行删除操作
 3、min最小元素也具有栈的特性,
    如果push的元素小于min,则min等于新加入的元素,
    如果pop的元素等于最小元素,则min为上一个最小元素(并不是两个最小元素之间的值)

 

/*
2.设计包含min 函数的栈。
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
要求函数min、push 以及pop 的时间复杂度都是O(1)。
*/

/*
	思路:
	1、min,push,pop都需要时间复杂度为O(1), 所以树,堆等数据结构都不能用
	2、栈只有通过push来添加元素,pop来删除元素,min操作只是获取元素数据,并不进行删除操作
	3、min最小元素也具有栈的特性,
	   如果push的元素小于min,则min等于新加入的元素,
	   如果pop的元素等于最小元素,则min为上一个最小元素(并不是两个最小元素之间的值)
*/

#ifndef INTERVIEW_1_H
#define INTERVIEW_1_H

#include <vector>
#include <cassert>

template <typename T>
class StackWithMin
{
public:
	void push(const T &data)
	{
		dataStack.push_back(data);

		if (0 == minStack.size())
		{
			minStack.push_back(data);
		}
		else if (minStack[minStack.size() - 1] > data)
		{
			minStack.push_back(data);
		}
	}

	void pop()
	{
		assert(!empty());
		if (!empty())
		{
			if (dataStack[dataStack.size() - 1] == minStack[minStack.size() - 1])
			{
				minStack.pop_back();
			}
			dataStack.pop_back();
		}
	}

	T& min()
	{
		assert(!empty());
		
		return minStack[minStack.size() - 1];
	}

	T& top()
	{
		assert(!empty());
		
		return dataStack[dataStack.size() - 1];
	}

	bool empty()
	{
		if (dataStack.size() == 0)
		{
			return true;
		}

		return false;
	}

private:
	std::vector<T> dataStack;
	std::vector<T> minStack;
};

#endif

 

#include "Interview_2.h"

#include <iostream>

using namespace std;

int main(void)
{
	StackWithMin<int> stack;

	int arr[5] = {5, 3, 4, 1, 2};

	for (int index = 0; index < 5; index++)
	{
		stack.push(arr[index]);
	}

	for (int index = 0; index < 5; index++)
	{
		cout << stack.min() << endl;
		stack.pop();
	}

	system("Pause");

	return 0;
}

 

// 原题目地址: http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html?87150

点赞