常量時間的棧操作(min/max)

push,pop,top,size,empty這些操作對於棧來說常量時間的,但是要想實現min,max的常量時間操作需要增加兩個棧,一個用於維護最小值,一個用於維護最大值。例如,對於min,每次入棧時將小於等於min棧頂的數值也壓到min棧,出棧是如果值等於min的棧頂,將min的棧頂出棧。

以下是實現的代碼,並不複雜。

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

template<typename type>
class xstack
{
public:
	void push(const type v) {
		if (stk.empty()) {
			min_stk.push(v);
			max_stk.push(v);
		} else {
			if (v <= min_stk.top())
				min_stk.push(v);
			if (v >= max_stk.top())
				max_stk.push(v);
		}
		stk.push(v);
	}

	void pop() {
		type v = stk.top();
		if (v == min_stk.top())
			min_stk.pop();
		if (v == max_stk.top())
			max_stk.pop();
		stk.pop();
	}

	type top() {
		return stk.top();
	}

	size_t size() {
		return stk.size();
	}

	bool empty() {
		return stk.empty();
	}

	type min() {
		return min_stk.top();
	}

	type max() {
		return max_stk.top();
	}

private:
	stack<type> stk;
	stack<type> min_stk;
	stack<type> max_stk;
};

int main()
{
	xstack<int> s;
	s.push(199);
	s.push(201);
	s.push(101);
	cout << s.size() << s.top() << s.min() << s.max() << endl;
	s.push(245);
	cout << s.size() << s.top() << s.min() << s.max() << endl;
	s.pop();
	s.pop();
	s.pop();
	cout << (s.empty() ? "empty" : "not empty") << endl;
	return 0;
}

發佈了29 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章