Переполнение очереди
В случае если после добавления элемента размер очереди, заданный пользователем вначале, превышен, появляется следующее сообщение:
В случае, если пользователь нажмет кнопку «Да», размер очереди будет увеличен на единицу и элемент будет добавлен, в случае отказа, форма состояние, в котором она была до нажатия кнопки «Поставить в очередь».
Альтернативный вид интерфейса
В случае нажатия кнопки «Переключить вид» интерфейс приложения принимает другой вид, выполненный в стиле автомата с газированной водой, логика управления программой не изменяется.
Реализация алгоритма
рис. 1 Окно приложения
Интерфейсная часть:
Логическая часть:
#include "Queue.h"
#include <iostream>
#include <Windows.h>
#ifdef _MANAGED
#pragma managed(push, off)
#endif
BOOL APIENTRY DllMain(
HMODULE ,
DWORD ul_reason_for_call,
LPVOID )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
MyQueue::MyQueue(int size)
{
mCurrent = -1;
if (size < 0)
{
mCapacity = 1;
mElementSet = new int[1];
}
else
{
mElementSet = new int[size];
mCapacity = size;
}
}
bool MyQueue::Exists(int node)
{
for (int i = 0; i < mCapacity; i++)
{
if (mElementSet[i] == node)
return true;
}
return false;
}
int MyQueue::GetCount()
{
return mCurrent >= 0 ? mCapacity : 0;
}
MyQueue::~MyQueue()
{
if (mElementSet != NULL)
{
delete[] mElementSet;
}
}
int& MyQueue::Insert(int node)
{
int* arr = new int[mCapacity + 1];
arr[0] = node;
if (mCapacity > 1)
{
for (int i = 0; i < mCapacity; i++)
{
arr[i + 1] = mElementSet[i];
}
delete [] mElementSet;
mElementSet = new int[mCapacity + 1];
mCurrent++;
for (int i = 0; i < mCapacity + 1; i++)
{
mElementSet[i] = arr[i];
}
}
else
{
mCurrent = 0;
mElementSet[0] = arr[0];
}
delete [] arr;
mCapacity++;
return GetCurrent();
}
void MyQueue::Remove()
{
if (mCurrent >= 0)
{
mCurrent--;
mCapacity--;
delete &mElementSet[mCapacity - 1];
}
}
void MyQueue::PrintElements()
{
for (int i = mCapacity - 1; i >= 0; i--)
{
std::cout << mElementSet[i] << std::endl;
}
getchar();
}
int& MyQueue::GetCurrent()
{
if (mCurrent >= 0)
{
return mElementSet[mCurrent];
}
}
int& MyQueue::MoveNext()
{
if (mCurrent >= 0);
{
if (mCurrent == mCapacity - 1)
{
mCurrent = 0;
}
else
{
mCurrent++;
}
}
return mElementSet[mCurrent];
}
void MyQueue::Invert()
{
int* arr = new int[mCapacity];
int j = 0;
for (int i = mCapacity - 1; i >= 0; i--)
{
arr[j] = mElementSet[i];
j++;
}
for (int i = 0; i < mCapacity; i++)
{
mElementSet[i] = arr[i];
}
}
void MyQueue::Clear()
{
mCurrent = -1;
delete [] mElementSet;
mElementSet = new int[1];
mCapacity = 1;
}