Я пишу класс для Deque в cpp и почти полностью его завершил.Я столкнулся со странной ошибкой, когда я получаю значения мусора после первого вызова функции insert_tail ().
Вот следующий код, на который я ссылаюсь.Заголовочный файл:
//File: Deque.h
#ifndef DEQUE_H
#define DEQUE_H
#include <iostream>
const int CAPACITY = 5;
const int DEFAULT = -1;
class Deque
{
public:
Deque()
{
front = 1;
end = 0;
size = 0;
}
int get_size() const;
int operator[](int) const;
void insert_head(int);
int remove_head();
void insert_tail(int);
int remove_tail();
bool is_empty() const;
bool is_full() const;
private:
int size;
int x_[CAPACITY];
int front;
int end;
};
std::ostream & operator<<(std::ostream &, const Deque &);
#endif
Файл реализации:
//File: Deque.cpp
#include <iostream>
#include "Deque.h"
std::ostream & operator<<(std::ostream & cout, const Deque & dq)
{
cout << dq.get_size() << " [ ";
for (int i = 0; i < dq.get_size(); ++i)
{
cout << dq[i] << " ";
}
cout << "]";
return cout;
}
int Deque::operator[](int x) const
{
return x_[x];
}
int Deque::get_size() const
{
return size;
}
void Deque::insert_head(int element)
{
if (size != CAPACITY)
{
x_[front] = element;
front = (front+1) % CAPACITY;
size++;
}
}
int Deque::remove_head()
{
if(is_empty())
{
return DEFAULT;
}
else
{
front = (front-1) % CAPACITY;
size--;
return x_[front];
}
}
void Deque::insert_tail(int element)
{
if (!is_full())
{
x_[end] = element;
end = (end-1) % CAPACITY;
size++;
}
}
int Deque::remove_tail()
{
if(is_empty())
{
return DEFAULT;
}
else
{
end = (end+1) % CAPACITY;
size--;
return x_[end];
}
}
bool Deque::is_empty() const
{
return (size == 0);
}
bool Deque::is_full() const
{
return (size == CAPACITY);
}
Тестовый файл:
//File: main.cpp
#include <iostream>
#include "Deque.h"
void print(const Deque & deque)
{
static int i = 1;
std::cout << i << ". " << deque << ", empty: " << deque.is_empty()
<< ", full: " << deque.is_full();
i++;
}
void test_remove_head(Deque & deque)
{
int x = deque.remove_head();
print(deque); std::cout << ", x: " << x << "\n";
}
void test_remove_tail(Deque & deque)
{
int x = deque.remove_tail();
print(deque); std::cout << ", x: " << x << "\n";
}
void test_insert_tail(Deque & deque, int x)
{
deque.insert_tail(x);
print(deque); std::cout << "\n";
}
void test_insert_head(Deque & deque, int x)
{
deque.insert_head(x);
print(deque); std::cout << "\n";
}
void test1()
{
Deque deque; print(deque); std::cout << "\n";
test_remove_tail(deque);
test_remove_head(deque);
test_insert_tail(deque, 2);
test_insert_tail(deque, 1);
test_insert_tail(deque, 0);
test_insert_head(deque, 5);
test_insert_head(deque, 1);
test_insert_tail(deque, 0);
test_insert_head(deque, 2);
test_remove_head(deque);
test_remove_tail(deque);
test_remove_tail(deque);
test_remove_tail(deque);
test_remove_head(deque);
test_remove_head(deque);
test_remove_head(deque);
}
void test2()
{
Deque deque;
for (int i=0; i<15; i++) test_insert_head(deque, i);
for (int i=0; i<15; i++) test_remove_tail(deque);
}
int main()
{
test1(); test2();
return 0;
}
Вывод:
1. 0 [ ], empty: 1, full: 0
2. 0 [ ], empty: 1, full: 0, x: -1
3. 0 [ ], empty: 1, full: 0, x: -1
4. 1 [ 2 ], empty: 0, full: 0
5. 2 [ 2 0 ], empty: 0, full: 0
6. 3 [ 2 0 0 ], empty: 0, full: 0
7. 4 [ 2 5 0 4198128 ], empty: 0, full: 0
8. 5 [ 2 5 1 4198128 0 ], empty: 0, full: 1
9. 5 [ 2 5 1 4198128 0 ], empty: 0, full: 1
10. 5 [ 2 5 1 4198128 0 ], empty: 0, full: 1
11. 4 [ 2 5 1 4198128 ], empty: 0, full: 0, x: 1
12. 3 [ 2 5 1 ], empty: 0, full: 0, x: 0
13. 2 [ 2 5 ], empty: 0, full: 0, x: 2
14. 1 [ 2 ], empty: 0, full: 0, x: 2
15. 0 [ ], empty: 1, full: 0, x: 5
16. 0 [ ], empty: 1, full: 0, x: -1
17. 0 [ ], empty: 1, full: 0, x: -1
18. 1 [ 32764 ], empty: 0, full: 0
19. 2 [ 32764 0 ], empty: 0, full: 0
20. 3 [ 32764 0 1 ], empty: 0, full: 0
21. 4 [ 32764 0 1 2 ], empty: 0, full: 0
22. 5 [ 4 0 1 2 3 ], empty: 0, full: 1
23. 5 [ 4 0 1 2 3 ], empty: 0, full: 1
24. 5 [ 4 0 1 2 3 ], empty: 0, full: 1
25. 5 [ 4 0 1 2 3 ], empty: 0, full: 1
26. 5 [ 4 0 1 2 3 ], empty: 0, full: 1
27. 5 [ 4 0 1 2 3 ], empty: 0, full: 1
28. 5 [ 4 0 1 2 3 ], empty: 0, full: 1
29. 5 [ 4 0 1 2 3 ], empty: 0, full: 1
30. 5 [ 4 0 1 2 3 ], empty: 0, full: 1
31. 5 [ 4 0 1 2 3 ], empty: 0, full: 1
32. 5 [ 4 0 1 2 3 ], empty: 0, full: 1
33. 4 [ 4 0 1 2 ], empty: 0, full: 0, x: 0
34. 3 [ 4 0 1 ], empty: 0, full: 0, x: 1
35. 2 [ 4 0 ], empty: 0, full: 0, x: 2
36. 1 [ 4 ], empty: 0, full: 0, x: 3
37. 0 [ ], empty: 1, full: 0, x: 4
38. 0 [ ], empty: 1, full: 0, x: -1
39. 0 [ ], empty: 1, full: 0, x: -1
40. 0 [ ], empty: 1, full: 0, x: -1
41. 0 [ ], empty: 1, full: 0, x: -1
42. 0 [ ], empty: 1, full: 0, x: -1
43. 0 [ ], empty: 1, full: 0, x: -1
44. 0 [ ], empty: 1, full: 0, x: -1
45. 0 [ ], empty: 1, full: 0, x: -1
46. 0 [ ], empty: 1, full: 0, x: -1
47. 0 [ ], empty: 1, full: 0, x: -1
Как вы можетесм. после строки 4. Соответствующие операторы вставки не завершены, а также функции x: from "remove_head ()" и "remove_tail ()" не получают правильные возвращаемые значения.