我正在为LeetCode的“设计循环设计”发布一个解决方案。如果你想复习,请这样做。谢谢!
设计循环双结束队列(deque)的实现。
您的实现应该支持以下操作:
MyCircularDeque(k):构造函数,将deque的大小设置为k。insertFront():在Deque前面添加一个项目。如果操作成功,则返回true。insertLast():在Deque的后面添加一个项目。如果操作成功,则返回true。deleteFront():从Deque前面删除一个项目。如果操作成功,则返回true。deleteLast():从Deque的后面删除一个项目。如果操作成功,则返回true。getFront():从Deque获得最前面的项目。如果设备是空的,返回-1。getRear():从Deque获得最后一项。如果设备是空的,返回-1。isEmpty():检查Deque是否为空。isFull():检查Deque是否已满。MyCircularDeque circularDeque = new MycircularDeque(3); // set the size to be 3
circularDeque.insertLast(1); // return true
circularDeque.insertLast(2); // return true
circularDeque.insertFront(3); // return true
circularDeque.insertFront(4); // return false, the queue is full
circularDeque.getRear(); // return 2
circularDeque.isFull(); // return true
circularDeque.deleteLast(); // return true
circularDeque.insertFront(4); // return true
circularDeque.getFront(); // return 4// The following block might slightly improve the execution time;
// Can be removed;
static const auto __optimize__ = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
// Most of headers are already included;
// Can be removed;
#include <cstdint>
#include <vector>
struct MyCircularDeque {
MyCircularDeque(int k): stream(k, 0), counts(0), k(k), head(k - 1), tail(0) {}
const bool insertFront(
const int value
) {
if (isFull()) {
return false;
}
stream[head] = value;
--head;
head += k;
head %= k;
++counts;
return true;
}
const bool insertLast(const int value) {
if (isFull()) {
return false;
}
stream[tail] = value;
++tail;
tail %= k;
++counts;
return true;
}
const bool deleteFront() {
if (isEmpty()) {
return false;
}
++head;
head %= k;
--counts;
return true;
}
const bool deleteLast() {
if (isEmpty()) {
return false;
}
--tail;
tail += k;
tail %= k;
--counts;
return true;
}
const int getFront() {
return isEmpty() ? -1 : stream[(head + 1) % k];
}
const int getRear() {
return isEmpty() ? -1 : stream[(tail - 1 + k) % k];
}
const bool isEmpty() {
return !counts;
}
const bool isFull() {
return counts == k;
}
private:
using ValueType = std::uint_fast16_t;
std::vector<ValueType> stream;
ValueType counts;
ValueType k;
ValueType head;
ValueType tail;
}; 发布于 2020-10-13 20:52:56
k, count, head, tail)感觉是错误的。至少,k和count应该是std::vector::size_type。std::vector备份deque,所以head和tail std::vector::iterator看起来更像惯用用法。k不是最具描述性的名称。考虑一下capacity。std::vector是否是备份固定尺寸设备的最佳容器。毕竟,std::vector的重点是要有一个动态大小。std::array,甚至是一个普通的C风格数组,看起来更自然。发布于 2020-10-13 20:53:22
我认为这是您的代码的一个主题:const,您已经放置它的地方,没有任何好处;它在其他地方也没有它应该存在的地方。MyCircularDeque中的每个函数都应该将const放在前面,因为这些返回值是标量的,因此标记它们const实际上没有任何效果。insertLast(const int value)有更多的效果,但实际上并不重要。
放置const最重要的地方是为get和is方法修改this的一致性。他们需要在括号后添加const。这将注册一个承诺,即这些方法不会修改任何成员。
发布于 2020-10-13 20:49:04
您可以在构造函数中调用stream.reserve(k)来提高向量的效率,因为您知道只有k元素,所以.reserve()会预先分配内存。
int k将是std::size_t k
您还没有声明一个复制构造函数或复制赋值算子。如果您希望将一个Deque分配给另一个,这可能会导致问题。
内衬您的struct的一些成员函数,如isEmpty()、getRear()、getFront()可以提高容器的性能,但它将是空间的交换。
。
现在,您的deque必须使用std::uint_fast16_t。但如果我想用名字做deque呢?还是一个不同十进制值的deque?我不能只为每种数据类型创建15个类。
因此,我将在模板中使用C++,以便创建一个通用 deque。
语法很简单
template < typename T >
struct deque
{
public:
// public member functions
private:
std::vector< T > stream;
};现在,当您想要创建一个新的deque时,您可以执行deque<any_data_type> my_deque。
无论您在哪里使用ValueType,都可以用T替换它。
C++所做的就是在编译时使用any_data_type并用该数据类型替换T。在您的程序中实现这一点将教会您很多关于模板如何在C++中工作的知识,这将对您的未来项目有所帮助。
https://codereview.stackexchange.com/questions/250609
复制相似问题