您的位置:首页 > 其它

【微软100题】002设计包含 min 函数的栈

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

#include <iostream>

using namespace std;

/*
 * 想法:用数组实现一个栈,这样 push和pop的时间复杂度都是O(1),每个数组元素,除了key值之外,还有一个值为当前元素到栈底元素之中的最小值
 */

struct CMinStack {

	struct CItem {
		int m_nKey;
		int m_nMin;
		CItem(int key) :
				m_nKey(key), m_nMin() {
		}
		CItem() :
				m_nKey(), m_nMin() {
		}
	};

	int m_pTop; //指向栈顶元素的位置
	CItem* m_aKeys; //用于存放元素的数组

	CMinStack(int len) :
			m_pTop(-1) { //初始时没有元素,让栈顶指向-1
		m_aKeys = new CItem[len];
	}

	~CMinStack() {
		//做一些内存清理的工作,防止内存泄露
		m_pTop = -1;
		delete[] m_aKeys;

	}

	/*
	 * 压栈
	 */
	void Push(int key) {
		this->m_aKeys[++m_pTop].m_nKey = key; //先赋值

		if (m_pTop > 0) {
			//表明之前已经有压入的元素,说明m_nMin值已经存在
			if (key < this->m_aKeys[m_pTop - 1].m_nMin) {
				this->m_aKeys[m_pTop].m_nMin = key;
			} else {
				this->m_aKeys[m_pTop].m_nMin = this->m_aKeys[m_pTop - 1].m_nMin;
			}
		} else {
			this->m_aKeys[m_pTop].m_nMin = key;
		}
	}

	/*
	 * 出栈
	 */
	int pop() {
		return this->m_aKeys[m_pTop--].m_nKey;
	}

	/*
	 * 求最小值
	 */
	int min() {
		return this->m_aKeys[m_pTop].m_nMin;
	}

};

int main() {

	CMinStack* c_min_stack = new CMinStack(10);

	c_min_stack->Push(5);
	c_min_stack->Push(8);
	c_min_stack->Push(-99);
	c_min_stack->Push(1024);
	c_min_stack->Push(6);
	c_min_stack->Push(3);
	c_min_stack->Push(0);
	c_min_stack->Push(1);
	c_min_stack->Push(-987);

	cout << c_min_stack->min() << endl;

	c_min_stack->pop();

	cout << c_min_stack->min() << endl;

	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: