左神的书——《程序员代码面试指南》之设计一个有getmin功能的栈 c++实现


题目:

//实现一个特殊的栈,在实现栈的基本功能的基础上,
//再实现返回栈中最小元素的操作。
//1.pop,push,getMin操作的时间复杂度都是o(1)
//2 设计的栈类型可以使用现成的栈结构。

#include<iostream>
using  namespace std ;
#include <stack>
#include <cassert>




//方法一:  一个辅助栈,如果这个栈为空,直接将元素入这个栈,如果辅助栈中有元素,将压入的元素和辅助栈顶元素比较,
//压入两者中较小的那个元素使得辅助栈总是维持栈顶元素为最小值。
//class Stack
//{
//public:
//	void Push(int data)
//	{
//		s1.push(data);
//		if (minstack.empty())
//		{
//			minstack.push(data);
//		}
//		else
//		{
//			int tmp = minstack.top();
//			int min = data > tmp ? tmp : data;
//			minstack.push(min);
//		}
//	}
//
//	void Pop()
//	{
//		assert(!s1.empty() && !minstack.empty());
//
//		s1.pop();
//		minstack.pop();
//	}
//
//	int GetMin()
//	{
//		assert(!minstack.empty());
//		return minstack.top();
//	}
//
//
//private:
//	stack<int> s1;
//	stack<int> minstack;
//
//};

//方法二: 一个辅助栈,如果这个栈为空,直接将元素入这个栈,如果辅助栈中有元素,将压入的元素和辅助栈顶元素比较,
//如果压入的元素小于等于辅助栈顶元素,者将这个元素入辅助栈,否则无操作,出栈的时候判断要出栈的元素是否等于辅助
//栈顶元素,如果是,也将辅助栈顶元素出栈。否则无操作。
class Stack
{
public:
	void Push(int data)
	{
		s1.push(data);
		if (minstack.empty())
		{
			minstack.push(data);
		}
		else
		{
			
			if (data <= minstack.top())
			{
				minstack.push(data);
			}
			
		}
	}

	void Pop()
	{
		assert(!s1.empty() && !minstack.empty());

		
		if (s1.top() == minstack.top())
		{
			minstack.pop();
		}
		s1.pop();
	}

	int GetMin()
	{
		assert(!minstack.empty());
		return minstack.top();
	}


private:
	stack<int> s1;
	stack<int> minstack;

};




int main()
{
	Stack s;
	//s.Push(5);
	s.Push(36);
	s.Push(15);
	s.Push(95);
	s.Push(50);
	s.Push(53);
	cout << s.GetMin() <<endl;
	s.Pop();
	s.Pop();
	s.Pop();
	s.Pop();
	cout << s.GetMin() <<endl;



	cout << "hello..." <<endl;
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值