实现最小栈的两种O(1)算法

最小栈的操作和普通栈的操作没有太大区别,唯一多了一个方法就是getMin()方法,这个方法是用来获取当前栈内的最小值。

直接上代码:

第一种:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<iostream>
#include<stack>
using namespace std;

class min_stack
{
public:
	void Push(int value)
	{
		if (s1.empty())//第一个元素进栈
		{
			s1.push(value);//s1为正常栈
			s2.push(value);//s2为存放正常栈的最小值
		}
		else
		{
			if (value > s2.top())//如果当前值大于最小值
			{
				s1.push(value);//只进s1
			}
			else//小于或等于
			{
				s1.push(value);
				s2.push(value);
			}
		}
	}
	void Pop()
	{
		if (s1.empty())
		{
			printf("栈为空\n");
			return;
		}
		if (s1.top() > s2.top())//如果s1的栈顶元素不是最小值
		{
			s1.pop();
		}
		else if (s1.top() == s2.top())//相等的话,两个都出栈
		{
			s1.pop();
			s2.pop();
		}
	}
	int GetMin()
	{
		return s2.top();//s2栈顶为当前栈元素内的最小值
	}
	int GetTop()
	{
		return s1.top();//返回正常栈栈顶
	}
	void Print()
	{
		if (s1.empty())
		{
			printf("栈为空\n");
			return ;
		}
		while (s1.size())
		{
			cout <<"|  "<< s1.top()<<"  |" << endl;
			s1.pop();
		}
		cout << "栈的最小元素为" << s2.top() << endl;
	}
private:
	stack <int> s1, s2;
};
int main()
{
	min_stack s1;
	
	s1.Push(1);
	s1.Push(3);
	s1.Push(-2);
	s1.Push(4);
	s1.Push(2);
	s1.Push(-3);
	s1.Pop();
	s1.GetMin();
	s1.GetTop();
	s1.Print();
	system("pause");
	return 0;
}


运行结果:


第二种:(用容器实现)

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>  
#include <vector>  
using namespace std;
class MinStack {
public:
	vector<int> stack;
	int min;
	void push(int x) {
		if (stack.empty()) //如果为空,直接入栈
		{
			stack.push_back(0);
			min = x;//设置min值为x
		}
		else//不为空
		{
			stack.push_back(x - min);//把值变为 x-min再入栈       切记!!!
			if (x < min) //如果要入栈得x小于当前min值
			{
				min = x;//更新min值
			}
		}

	}

	void pop() {
		if (stack.empty()) {
			return;
		}
		else{
			if (stack.back() < 0) //因为back是通过当前元素x-min值得到的,所以back为负数说明这时候得入栈操作min值已被更新
			{
				min = min - stack.back();//更新回原来的min值
			}
			stack.pop_back();
		}
	}

	int top() {
		if (stack.empty()) {
			return NULL;
		}
		if (stack.back() > 0) //如果大于0,直接加上min值
		{
			return stack.back() + min;
		}
		else{
			return min;//小于0,说明当前得x比min小,更新min,也可以同上
		}
	}

	int getMin() 
	{
		if (stack.empty()) {
			return NULL;
		}
		return min;
	}
};

int main() {
	MinStack s1;
	s1.push(1);
	s1.push(3);
	s1.push(-2);
	s1.push(4);
	s1.pop();
	s1.top();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/KomaCC/article/details/80454304