设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1)

一般定义的栈,若pop和push是O(1),则求最小值时需要遍历栈,则复杂度是O(N);
所以在栈类型实现当中,需要定义一个数组来记录最小值的出现顺序,也就是用空间复杂度换取时间复杂度
代码的实现如下,主要用到了一个mystack动态数组操作普通的栈;一个 minstack数组栈顶用于记录最小的值

#include<iostream>
using namespace std;
#define mystack_empty -1
template<typename T>
class _mystack{
public:
	_mystack(int c, int i) :capacity(c),_top(i){
		mystack = new T[capacity];
		minstack = new T[capacity];
	}
	~_mystack()
	{
		delete[] mystack;
		delete[] minstack;
	}
	void push(const T &t)
	{
		if (_top < capacity)
		{
			//入mystack栈
			mystack[_top+1] = t;
			//把比minstack栈顶元素小的指入栈到minstack中,
			//minstack用于记录最小的元素;
			if (_top<0 || minstack[_top]>t)
			{
				minstack[_top+1] = t;
			}
			else
			{
				//minstack的栈顶一直保持最小的值
				minstack[_top + 1] = minstack[_top];
			}
			++_top;
		}
		//满栈
		else
		{
			cout << "The Stack is Fulled!\n";
		}
	}
	void pop()
	{
		if (_top >= 0)
		{
			_top--;
		}
		else
		{
			cout << "The Stack is Empty!\n";
		}
	}
	T min()
	{
		if (_top >= 0)
		{
			return minstack[_top];
		}
		else
		{
			cout << "The minStack is Empty!\n";
			return mystack_empty;
		}
	}
	T top()
	{
		if (_top >= 0)
		{
			return mystack[_top];
		}
		else
		{
			cout << "The Stack is Empty!\n";
			return mystack_empty;
		}

	}
private:
	int capacity;
	int _top;
	T *mystack;
	T *minstack;
};
int main(void)
{
	_mystack<int> s(1024,-1);
	for (int i = 0; i < 10; ++i)
	{
		s.push(i);
	}
	cout << "top: "<< s.top() << endl;
	s.pop();
	cout << "top: "<< s.top() << endl;
	cout << "min: "<< s.min() << endl;
	return 0;

}


运行结果如下所示:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值