微软等数据结构与算法面试100题 第二题


第二题


题目: 要求设计一个栈,栈包含min函数的功能,即能够在O(1)的时间内做min, pop, push运算。


分析:

因为传统的栈只有push和pop功能,push和pop功能都是在O(1)的时间内做操作,题目要求具有min函数的功能,也就是在pop操作和push操作以后可以

在O(1)的时间内给出最小值的功能。因为如果是直接增加min函数,那么每次计算最小值的时候都是O(N)的时间,为了要达到O(1)的时间,因此需要一个

数组来存储这一动态变化过程,min_array中min_array[k]存储前K个数字里面最小值。


代码:

#include<iostream>
using namespace std;


template <class T>
class Stack{

private:

	int size;
	T * data;
	int top;
	T * min_data;
	T min_value;

public:
		
	Stack(int size = 100);
	~Stack();

	T pop();
	//为什么要去地址呢 

	void push(const T item);
	void print(){cout<<min_value<<endl;}


};

template<class T>
Stack<T>::Stack(int size){
	 
	data = new T [size];
	min_data = new T [size];
	this->top = -1; 

}

template<class T>
Stack<T>::~Stack()
{

	delete []data;
	delete []min_data;
}


template<class T>
void Stack<T>::push(const T  item)
{
	if(top==size-1){
		cout<<"堆栈溢出"<<endl;
		//return;
	}	
	top ++;
	data[top]=item;
	
	if(top==0) 
	{
		min_data[top] = item;
		min_value = item;
	}
	else
	{
		if(item < min_data[top-1])
		{
			min_data[top] = item;
			min_value = item;
		}
		else
		{
			min_data[top] = min_data[top-1];
			this->min_value = min_data[top-1];
		}
	}
}

template<class T>
T Stack<T>::pop()
{
	if(top==-1)
	{
		cout<<"堆栈空"<<endl;
		return -1;
	}
	
	T DATA_POP = data[top];

	min_value = min_data[top-1];

	top = top -1;

	

	return DATA_POP;

}


int main(){

	int stack_size = 100;
	Stack<int> a_value(stack_size);

	// test
	a_value.push(10);
	a_value.print();
		
	a_value.push(2);
	a_value.print();
	
	a_value.push(3);
	a_value.print();
	
	a_value.push(1);
	a_value.print();
	a_value.push(5);
	a_value.print();
	
	cout<<"sc"<<endl;
	a_value.pop();
	a_value.print();
	
	a_value.pop();
	a_value.print();	 
	

	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值