/*
Шаблон очереди и модуль тест.
Язык реализации: С++
*/
#include <iostream>
// размер массива (по умолчанию) под очередь
#define N 10
using namespace std;
//////////////////////////////////////////////////////////
// Начало шаблона
//////////////////////////////////////////////////////////
template <class T>
class queue {
private :
T *q; // указатель на массив
int begin; // первый элемент очереди
int end; // последний элемент очереди
public :
queue (void); // конструктор
~queue (); // деструктор
bool isEmpty (); // проверка на пустоту
T size (); // количество элементов в очереди
T pop (void); // взятие элемента
void push (T i); // добавление элемента
T showHead (); // посмотреть первый элемент
T showTail (); // посмотреть последний элемент
T makeEmpty (); // очистить очередь
};
// конструктор
template <class T>
queue <T> :: queue (void) {
if (!(q = new T[N])) {
cout << "Can't create array, because hav't free memory!\n";
return;
}
begin = end = 0;
cout << "Initialization ok.\n";
}
// дестуктор
template <class T>
queue <T> :: ~queue () {
delete q;
cout << "\nDestroyed.";
}
// проверка на пустоту
template <class T>
bool queue <T> :: isEmpty () {
return begin;
}
// размер очереди
template <class T>
T queue <T> :: size () {
return (begin-end);
}
// заполнение очереди
template <class T>
void queue <T> :: push (T i) {
if (begin == N) {
cout << "Full.\n";
return;
}
q[begin++] = i;
}
// вынимает элемент
template <class T>
T queue <T> :: pop (void) {
if (begin == end) {
cout << "Empty.\n";
return 0;
}
return q[end++];
}
//////////////////////////////////////////
// НЕ РАБОТАЕТ!!!
/////////////////////////////////////////
// посмотреть первый элемент
template <class T>
T queue <T> :: showHead () {
cout << "\nHead - " << q[end];
}
// посмотреть хвост
template <class T>
T queue <T> :: showTail () {
if (begin == end) {
cout << "\nTail - " << q[begin];
}
else cout << "\nTail - " << q[begin-1];
}
// очистка очереди
template <class T>
T queue <T> :: makeEmpty () {
begin = 0;
end = 0;
}
//////////////////////////////////////////////////////////
// Конец шаблона
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// Начало модуль теста
//////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
// создаем объекты
queue <int> a;
queue <double> b;
queue <long int> c;
// начинаем тестировать работу
cout << "Now queue is empty (return 0):";
cout <<"\n" << a.isEmpty();
for (int i = 0; i < N; i++) {
a.push(i);
}
a.showHead();
cout << "\n" <<a.size();
cout <<"\n" << a.isEmpty();
a.showTail();
// вынимаем элементы очереди
cout << endl;
for (int i = 0; i < N; i++) {
cout << a.pop() << " ";
}
// функции не правильно работают
a.showHead();
b.showHead();
b.showTail();
b.push(2.5);
b.push(3.5);
b.push(6.89);
cout << "\n" << b.size();
b.showHead();
b.showTail();
cout << "\n" <<b.pop() << " ";
cout << "\n" <<b.pop() << " ";
cout << "\n" <<b.pop() << " ";
cout << "\n" << b.size();
// явный вызов деструктора
a.~queue();
b.~queue();
system("PAUSE");
return EXIT_SUCCESS;
}
//////////////////////////////////////////////////////////
// Конец модуль теста и программы
//////////////////////////////////////////////////////////
template <class T>(допустимые индексы - от 0 до 9, чтобы было понятно, о чем я)
T queue <T> :: showHead () {
cout << "\nend = " << end << " ";
cout << "Head - " << q[end];
}
// посмотреть первый элементМетод ничего не возвращает - я сделала его void-ом...
template <class T>
T queue <T> :: showHead () {
cout << "\nHead - " << q[end];
}
template <class T>
T queue <T> :: pop (void) {
if (end < 0) {
cout << "Empty.\n";
return 0;
}
T value = q[begin];
for(int i = 0; i < end; ++i) q[i] = q[i + 1];
end -= 1;
return value;
}
T value = q[begin];?
for(int i = 0; i < end; ++i) q[i] = q[i + 1];аналогично
int i = 0;
while(i < end) {
q[i] = q[i + 1];
++i;
}
#include <iostream>
#define N 20
using namespace std;
template <class T>
class queue{
private:
T q[N];
T *begin;
T *end;
public:
queue();
~queue();
void push(T);
T pop();
T showHead();
bool isEmpty();
void makeEmpty();
};
template <class T>
queue<T> :: queue(){
begin = end = q;
cout << "\n:: Initialization ok.";
}
template <class T>
queue <T> :: ~queue() {
cout << "\n:: Destroyed.";
}
template <class T>
bool queue <T> :: isEmpty(){
return (begin == end);
}
template <class T>
void queue <T> :: push(T i){
*end = i;
if(end ==(q + N-1)){
end = q;
}
else{end++;}
}
template <class T>
void queue <T> :: makeEmpty() {
begin = end = q;
cout << "\n:: Queue is cleaned.";
}
template <class T>
T queue <T> :: showHead(){
if(this->isEmpty()){
cout << "\n:: Queue is empty.";
return 0;
}
else { return (*begin);}
}
T queue <T> :: pop(){
if(this->isEmpty()){
cout << "\n:: Queue is empty.";
return 0;
}
else{
T first = this->showHead();
if (begin == q + N - 1) {
begin = q;
}
else { begin++; }
return first;
}
}
main() {
cout << "::::::: Module test ::::::::";
cout << "\n:: Creating new queue.";
queue <int> a;
cout << "\n:: Elements pushing in <int> queue...";
a.push(14);
a.push(12);
a.push(16);
a.push(17);
for (int i = 0; i < 9; i++) {
a.push(i);
}
cout << "\n:: Head - " << a.showHead() << endl;
cout << "\n:: Poped head - " << a.pop();
cout << "\n:: Head - " << a.showHead() << endl;
cout << "\n:: All elements: ";
cout << "\n:: ";
for (int i = 0; i < 12; i++) {
cout << a.pop() << " ";
}
// явный вызов деструктора
a.~queue();
// return 0
system("PAUSE");
return EXIT_SUCCESS;
}