问题:设计一个特殊队列的数据结构,它支持以下操作 enque、deque、getMin() 或 getMax(),其中 getMin() 操作需要 O(1) 时间。
例子:
Let the data to be inserted in queue be -
4, 2, 1, 6
Operation Queue Output
push(4) 4 -
push(2) 4, 2 -
push(1) 4, 2, 1 -
getMin() 4, 2, 1 1
push(6) 4, 2, 1, 6 -
pop() 2, 1, 6 4
pop() 1, 6 2
pop() 6 1
getMin() 6 6
// Notice the getMin() function call
// It returns the minimum element
// of all the values present in the queue
做法:思路是,如果结构要返回最小元素,则使用双端队列,按升序存储,如果结构要返回最大元素,则按降序存储。数据结构的操作定义如下:
恩克
- 将元素插入到队列结构中。
- 如果 Deque 结构的大小为空,则 Deque 的大小为 0。然后,从后面插入元素。
- 否则,如果 Deque 结构中有一些元素,则将元素从 Deque 中弹出,直到 Deque 的后面大于当前元素,然后最后从后面插入元素。
德克
- 如果 Deque 的第一个元素等于队列的前面元素,则同时从 Queue 和 Deque 中弹出元素。
- 否则,从队列的前面弹出元素以保持元素的顺序。
获得最小值
返回Deque的前元素,得到队列当前元素的最小元素。
下面是上述方法的实现:
C++
// C++ implementation to design
// a queue data structure to get
// minimum element in O(1) time
#include
using namespace std;
template
// Structure of the queue
class MinMaxQueue {
public:
// Queue to store the
// element to maintain the
// order of insertion
queue Q;
// Doubly ended queue to
// get the minimum element
// in the O(1) time
deque D;
// Function to push a element
// into the queue
void enque_element(T element)
{
// If there is no element
// in the queue
if (Q.size() == 0) {
Q.push(element);
D.push_back(element);
}
else {
Q.push(element);
// Pop the elements out
// until the element at
// back is greater than
// current element
while (!D.empty() &&
D.back() > element) {
D.pop_back();
}
D.push_back(element);
}
}
// Function to pop the element
// out from the queue
void deque_element()
{
// Condition when the Minimum
// element is the element at
// the front of the Deque
if (Q.front() == D.front()) {
Q.pop();
D.pop_front();
}
else {
Q.pop();
}
}
// Function to get the
// minimum element from
// the queue
T getMin()
{
return D.front();
}
};
// Driver Code
int main()
{
MinMaxQueue k;
int example[3] = { 1, 2, 4 };
// Loop to enque element
for (int i = 0; i < 3; i++) {
k.enque_element(example[i]);
}
cout << k.getMin() << "\n";
k.deque_element();
cout << k.getMin() << "\n";
}
输出:
1
2
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live