Добрый день!
Я пытаюсь сделать что-то вроде кругового стека.Это должно быть как обычный стек LIFO, но без видимого ограничения.Вместо того, чтобы достичь максимальной емкости, он должен исключить или перепрыгнуть через первый элемент, введенный в тот момент времени!
Например:
Допустим, у нас есть стек с3 элемента: stack[3]
Мы заполняем его, «проталкивая» 3 элемента внутрь: push[a], push[b], push[c]
.
Но тогда мы захотим добавить 4-й и 5-й элемент: push[d], push[e]
.
Стандартные стеки скажут, что стек достиг своего предела и больше не может добавлять элементы.
Но я хочу, чтобы круговой стек исключал или перепрыгивал через a
и b
, помните c
, d
и e
и вывод e
, d
и c
;
Проект выполняется в PlatformIO на ESP32, поэтому я неу меня есть доступ к C ++ STL, и даже если бы я имел, я думал, что компилировать такую большую библиотеку всего за 1 стек бессмысленно.Даже если бы было время, когда я думал, что должен скомпилировать подобную библиотеку, которая должна дать мне доступ к stack
или deque
, это время давно прошло, потому что сейчас я чувствую себя идиотом, который не может понятьматематическая задачаЭто беспокоило меня уже больше недели.
Все, что мне удалось найти в Интернете, это следующий циклический буфер FIFO:
class circular_buffer {
public:
explicit circular_buffer(size_t size) :
buf_(std::unique_ptr<T[]>(new T[size])),
max_size_(size)
{
}
void put(T item)
{
std::lock_guard<std::mutex> lock(mutex_);
buf_[head_] = item;
if(full_) {
tail_ = (tail_ + 1) % max_size_;
}
head_ = (head_ + 1) % max_size_;
full_ = head_ == tail_;
}
T get()
{
std::lock_guard<std::mutex> lock(mutex_);
if(empty())
{
return T();
}
//Read data and advance the tail (we now have a free space)
auto val = buf_[tail_];
full_ = false;
tail_ = (tail_ + 1) % max_size_;
return val;
}
void reset()
{
std::lock_guard<std::mutex> lock(mutex_);
head_ = tail_;
full_ = false;
}
bool empty() const
{
//if head and tail are equal, we are empty
return (!full_ && (head_ == tail_));
}
bool full() const
{
//If tail is ahead the head by 1, we are full
return full_;
}
size_t capacity() const
{
return max_size_;
}
size_t size() const
{
size_t size = max_size_;
if(!full_)
{
if(head_ >= tail_)
{
size = head_ - tail_;
}
else
{
size = max_size_ + head_ - tail_;
}
}
return size;
}
private:
std::mutex mutex_;
std::unique_ptr<T[]> buf_;
size_t head_ = 0;
size_t tail_ = 0;
const size_t max_size_;
bool full_ = 0;
};
Я возился с ним в прошлом3 дня, но я просто не могу заставить его работать так, как я хочу.Она, будучи структурой FIFO, будет печатать a
, b
, c
или c
, d
, e
.
Я хочу, чтобы она печаталась сверху вниз, изголова к хвосту в этом случае, но я не могу понять это.