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;
}