Я реализую очередь с использованием вектора в C ++
Я использую переменную sz
, чтобы отслеживать, сколько свободных элементов находится в очереди при любой операции вставки / удаления.
I столкнулся с проблемой в моей реализации, где я сравнивал:
sz < vec.size() - 1
В какой-то момент эта строка начала возвращать 0
, и сравнение было
-1 < 5
Одна вещь, которая помогла делал это
int vecsz = vec.size() - 1;
int regsz = sz;
if (regsz < vecsz)
{
sz++;
}
Хотя это помогло, я все еще не понимаю, почему. Может кто-нибудь пролить свет на это, пожалуйста?
queue.h
#include <iostream>
#include <vector>
using namespace std;
template <typename Object>
class queue
{
public:
queue(int s)
: vec(s)
{
sz = s - 1;
}
queue () { }
~queue() { }
/**
* Add element to Q and decrease size
*/
void enque(Object obj)
{
if (sz >= 0) {
vec[sz] = obj;
sz--;
}
}
/**
* Remove element from Q and increase size
*/
Object deque()
{
// grab last element
int last = vec[vec.size() - 1];
// remove last element from array
vec.pop_back();
// insert 0 in the front
vec.insert(vec.begin(), 0);
int vecsz = vec.size() - 1;
int regsz = sz;
// increase size tracking var
if (regsz < vecsz)
{
sz++;
}
return last;
}
void print() {
for (int i = 0; i < vec.size(); ++i) {
cout << "i: " << vec[i] << endl;
}
}
private:
vector<int> vec;
int sz;
};
main
int main()
{
queue<int> Q(5);
cout << "Empty Q:" << endl;
Q.print();
cout << endl;
Q.enque(1);
Q.enque(2);
Q.enque(3);
cout << "Full Q1:" << endl;
Q.print();
cout << "Deque " << endl;
cout << Q.deque() << " " << Q.deque() << " " << Q.deque() << " " << endl;
cout << Q.deque() << endl;
cout << "Print " << endl;
Q.print();
cout << "Enqueue " << endl;
Q.enque(10);
Q.enque(20);
Q.enque(30);
Q.enque(40);
Q.enque(50);
cout << "\nFull Q2:" << endl;
Q.print();
cout << endl;
cout << Q.deque() << endl;
Q.enque(100);
cout << "Full Q3:"; Q.print(); cout << endl;
cout << Q.deque() << endl;
cout << Q.deque() << endl;
cout << Q.deque() << endl;
cout << Q.deque() << endl;
return 0;
}