search

Рекомендация: прочитайте задачу! Выполните ее и сравните полученный результат с картинкой CMD

Если вы полностью уверены что не можете осилить эту задачу, советую вам просмотреть код и полностью в нем разобраться! Протестировать все в отладчике!

Создайте шаблонную очередь на базе двунаправленного списка!

/*Athor Dombrovsky I.V.*
 *Academy "STEP"	   *
 *GROUP 32PPS21*	   *
 ***********************
TASK =======>>>>>>>>>>>>>>>>>
Реализовать шаблонный класс "Очередь" на основе двусвязного списка.
*/

#include <iostream>
using namespace std; 
#define STOP system("pause"); 
#define COLOR_GREEN_TEXT system("color 0A");

template<class T>
class Node {
public:
	Node * next;
	Node * previous;
	T data;
};

template<class T>
class List
{
public:
	List();
	~List();
	void addElement(T data);
	void showListStartHead();
	void showListStartTail();
	void deleteElementListFirst();
	void deleteElementListLast();
	void deleteAllListWithFirst();
	void deleteAllListWithLast();
	void DeleteSpecifiedElement(int position, int searchStart);
	int getSize();

private:
	Node<T> * head; 
	Node<T> * Tail;
	int count; 
};

template<class T>
List<T>::List() : head(NULL), Tail(NULL), count(0)
{
	// DEFAULT
	cout << "WORK CONSTRUCTOR" << endl; 
}

template<class T>
List<T>::~List() // DESTRUCTOR
{
	this->head = NULL; 
	this->Tail = NULL; 
	this->count = 0; 
}

template<class T>
void List<T>::addElement(T data) // ADD ELEMENTS TO LIST
{
	Node<T> * temp = new Node<T>; 
	if (head == NULL)
	{
		temp->previous = NULL;
		temp->next = NULL; 
		temp->data = data; 
		head = temp; 
		Tail = temp; 
		count++; 
	}
	else
	{
		temp->previous = Tail; 
		Tail->next = temp; 
		temp->next = NULL; 
		temp->data = data; 
		Tail = temp; 
		count++; 
	}
}

template<class T>
void List<T>::showListStartHead() // DISPLAY LIST WITH FIRST
{
	Node<T> * temp = head; 
	while (temp != NULL)
	{
		cout << "Adress = " << temp << " " << temp->data << endl; 
		temp = temp->next; 
	}
}

template<class T>
void List<T>::showListStartTail() // DISPLAY LIST WITH LAST
{
	Node<T> * temp = Tail;
	while (temp != NULL)
	{
		cout << "Adress = " << temp << " " << temp->data << endl;
		temp = temp->previous;
	}
}

template<class T>
void List<T>::deleteElementListFirst() // DELETE ELEMENT WITH FIRST
{
	if (count > 0)
	{
		Node<T> * temp = head;
		if (temp->next != NULL)
		{
			head = temp->next;
			head->previous = NULL;
			delete temp;
			count--;
		}
		else
		{
			delete temp;
			count--;
			head = Tail = NULL;
		}
	}
	else
	{
		cerr << "List empty!" << endl; 
	}
}

template<class T>
void List<T>::deleteElementListLast() // DELETE ELEMENT WITH LAST
{
	if (count > 0)
	{
		Node<T> * temp = Tail;
		if (temp->previous != NULL)
		{
			Tail = temp->previous;
			Tail->next = NULL;
			delete temp;
			count--;
		}
		else
		{
			delete temp;
			count--;
			head = Tail = NULL;
		}
	}
	else
	{
		cerr << "List empty!" << endl;
	}
}

template<class T>
void List<T>::deleteAllListWithFirst() // DELETE ALL LIST WITH FIRST
{
	while (count)
	{
		deleteElementListFirst();
	}
}

template<class T>
void List<T>::deleteAllListWithLast() // DELETE ALL LIST WITH LAST
{
	while (count)
	{
		deleteElementListLast();
	}
}

template<class T>
void List<T>::DeleteSpecifiedElement(int position, int searchStart) // SEARCHSTART 0 => FIRST OR SEARCHSTART 1 => LAST
{
	if (count > 0)
	{
		Node<T> * temp = NULL;
		bool flag = true; 
		if (searchStart >= 0 && searchStart <= 1)
		{
			if (position > 1 && position < count) // IF LIST HAS MORE ONE ELEMENT
			{
				if (searchStart == 0)
				{
					temp = head;
				}
				if (searchStart == 1)
				{
					temp = Tail;
				}
				while (position - 1)
				{
					if (searchStart == 0)
					{
						temp = temp->next;
					}
					if (searchStart == 1)
					{
						temp = temp->previous;
					}
					position--;
				}
				temp->previous->next = temp->next; // REMAP ADDRESS = NEXT ELEMENT
				temp->next->previous = temp->previous; //  REMAP ADDRESS = PRAVIOUS ELEMENT
				delete temp;
				count--;
			}else if (position == 1 || position == count)
			{
				if (searchStart == 0)
				{
					if(position == 2)
						deleteElementListLast();
					else
						deleteElementListFirst();
				}
				if (searchStart == 1)
				{
					if (position == 2)
						deleteElementListFirst();
					else
						deleteElementListLast();
				}
			}
			if (position < 0 || position > count)
			{
				cerr << "Position error!" << endl;
			}
		}
		else
		{
			cerr << "First and last error!" << endl;
		}
	}
	else
	{
		cerr << "List empty!" << endl; 
	}
}

template<class T>
int List<T>::getSize()
{
	return count;
}

template<class T>
class Queue // FIFO
{
public:
	Queue();
	~Queue();
	void addElement(T element);
	int getSize();
	void showQueue();
	void deleteElement();
	void clearQueue();

private:
	List<T> l; 
	int SIZE; 
};

template<class T>
Queue<T>::Queue() : SIZE(0) // CONSTRUCTOR
{
	// DEFAULT
}

template<class T>
Queue<T>::~Queue() // DESTRUCTOR
{
	this->SIZE = 0; 
}

template<class T>
void Queue<T>::addElement(T element) // ADD ELEMENT TO QUEUE
{
	l.addElement(element);
	this->SIZE = l.getSize(); 
}

template<class T>
int Queue<T>::getSize() // GET SIZE QUEUE
{
	return this->SIZE;
}

template<class T>
void Queue<T>::showQueue() // DISPLAY QUEUE
{
	l.showListStartHead();
}

template<class T>
void Queue<T>::deleteElement() // DELETE ELEMENT OF QUEUE
{
	l.deleteElementListFirst();
	this->SIZE = l.getSize();
}

template<class T>
void Queue<T>::clearQueue()
{
	l.deleteAllListWithFirst();
}


int main() {
	COLOR_GREEN_TEXT
		Queue<int> q; // CREATE QUEUE

		q.addElement(52);
		q.addElement(85);
		q.addElement(100);
	cout << "**********************************" << endl;
		q.showQueue();
		cout << "SIZE = " << q.getSize() << endl;
	cout << "**********************************" << endl;
		q.deleteElement();
		q.showQueue();
		cout << "SIZE = " << q.getSize() << endl;
	cout << "**********************************" << endl;
		q.deleteElement();
		q.showQueue();
		cout << "SIZE = " << q.getSize() << endl;
	cout << "**********************************" << endl;
	STOP
}


array	
Есть строка символов, признаком конца, которой является «;». В строке могут быть фигурные, круглые, квадратные скобки. Скобки могут быть открывающими и закрывающими. Необходимо проверить корректность расстановки скобок. Правила расстановки скобок следующие: 1. Каждая открывающая скобка должна иметь справа такую же закрывающую. 2. Открывающие и закрывающие пары скобок разных типов должны быть правильно расположены по отношению друг к другу. ■■Пример правильной строки: ({x-y-z}*[x+2y]-(z+4x)); ■■Пример неправильной строки: ([x-y-z}*[x+2y)-{z+4x)]. Если все правила соблюдены выведите информационное сообщение о корректности строки, иначе покажите строку до места возникновения первой ошибки. Подсказка. Данные действия можно запрограммировать на основе стека.

/*Dombrovsky I.V.
TASK 
Есть строка символов, признаком конца, которой является «;». В строке могут
быть фигурные, круглые, квадратные скобки. Скобки могут быть
открывающими и закрывающими.
Необходимо проверить корректность расстановки скобок.
Правила расстановки скобок следующие:
1. Каждая открывающая скобка должна иметь справа такую же закрывающую.
2. Открывающие и закрывающие пары скобок разных типов должны быть
правильно расположены по отношению друг к другу.
■■Пример правильной строки: ({x-y-z}*[x+2y]-(z+4x));
■■Пример неправильной строки: ([x-y-z}*[x+2y)-{z+4x)].
Если все правила соблюдены выведите информационное сообщение о
корректности строки, иначе покажите строку до места возникновения первой
ошибки.
Подсказка. Данные действия можно запрограммировать на основе стека.
*/
#include <iostream>
#include <new>
#include <cstring>
using namespace std; 
#define STOP_CMD system("pause");
#define COLOR_CMD system("color 0A"); 

class Stack // STACK
{
public:
	Stack();
	~Stack();
	void clear();
	void setElement(const char element);
	char getElement();
	int getSize();
	int getCount();
	void show();
private:
	char * STACK; 
	const int SIZE = 80; 
	int count; 
};

Stack::Stack() : STACK(NULL), count(0) // CONSTRUCTOR
{
	try { // CHECK MEMORY
		STACK = new char[SIZE + 1](); 
	}
	catch (bad_alloc &memoryAllocationException) {
		cerr << "Exception occured: [ERROR MEMORY]" << memoryAllocationException.what() << endl; // Fixed output
	}
}

Stack::~Stack() // DESTRUCTOR
{ 
	delete[] this->STACK;
	this->STACK = NULL; 
	count = 0; 
}

void  Stack::clear() // CLEAR STACK
{
	if (count > 0)
	{
		while (count)
		{
			getElement();
		}
	}
}

void Stack::setElement(const char element) // // ADD ELEMENT TO STACK
{
	if (count < SIZE)
	{
		this->STACK[count] = element;
		count++;
	}
}

char Stack::getElement() // GET ELEMENT OF STACK
{
	if (count > 0)
	{
		char temp = STACK[count - 1];
		this->STACK[count] = 0;
		count--;
		return temp;
	}
	else
	{ 
		return 0; 
	}
}

int Stack::getSize() // GET SIZE ==>> STACK
{
	return this->SIZE;
}

int Stack::getCount() //  GET VALUE BUSY STACK NOW
{
	return this->count;
}

void Stack::show() // DISPLAY STACK TO CMD
{
	for (size_t i = 0; i < count; i++)
	{
		cout << this->STACK[i]; 
	}
	cout << endl; 
}

int main(){
	COLOR_CMD // CONST CMD COLOR TEXT GREEN BACKGROUND BLACK
//----------------------------------------------------
	Stack stack; // CREATE STACK
//----------------------------------------------------
	cout << "Enter line without space MAX [80]: " << endl; 
	cout << "Exeample: ({x-y-z}*[x+2y]-(z+4x))" << endl;
	cout << "Bad exeample: ([x-y-z}*[x+2y)-{z+4x)]" << endl;

	char * str = new char[81](); // STR 
	cin.getline(str, 81);

	int index = 0; 
	while (str[index] != '\0')
	{
		index++; 
	}

	if (str[index - 1] != ';') // CHECKING END STR
	{
		cout << "No see ==>> ;" << endl; 
	}
	else
	{
		int i = 0, showMistakes = 0; 
		bool check = true; 
		char SMS = 'n';
//************************************************************************
// processing (
//************************************************************************
		while (str[i] != '\0' && check == true)
		{
			if (str[i] == '(') // IF FOUND BRECKET 
			{
				showMistakes = i + 1; // GET SHOW MISTAKES
				stack.setElement(str[i]); // PUSH IN STACK
			}
			if (str[i] == ')') // IF FOUND BRECKET CLOSE GET OF STACK BRECKET OPEN
			{
				if (stack.getElement() == 0)
				{
					check = false;
				} 
			}
			i++; 
		}
		if (stack.getElement() != 0)
		{
			check = false;
		}
		if (check == false)
		{
			cout << "error ==>> " << "\t";
			i = 0; 
			SMS = 'y';
			while (i != showMistakes)
			{
				cout << str[i]; 
				i++;
			}
			cout << endl; 
		}
//************************************************************************
// processing {
//************************************************************************
		i = 0; 
		showMistakes = 0; 
		while (str[i] != '\0' && check == true)
		{
			if (str[i] == '{')
			{
				showMistakes = i + 1;
				stack.setElement(str[i]);
			}
			if (str[i] == '}')
			{
				if (stack.getElement() == 0)
				{
					check = false;
				}
			}
			i++;
		}
		if (stack.getElement() != 0)
		{
			check = false;
		}
		if (check == false && SMS == 'n')
		{
				cout << "error ==>> " << "\t";
				SMS = 'y';
			i = 0;
			while (i != showMistakes)
			{
				cout << str[i];
				i++;
			}
			cout << endl;
		}
//************************************************************************
//	processing [
//************************************************************************
		i = 0;
		showMistakes = 0;
		while (str[i] != '\0' && check == true)
		{
			if (str[i] == '[')
			{
				showMistakes = i + 1;
				stack.setElement(str[i]);
			}
			if (str[i] == ']')
			{
				if (stack.getElement() == 0)
				{
					check = false;
				}
			}
			i++;
		}
		if (stack.getElement() != 0)
		{
			check = false;
		}
		if (check == false && SMS == 'n')
		{
				cout << "error ==>> " << "\t";
			i = 0;
			while (i != showMistakes)
			{
				cout << str[i];
				i++;
			}
			cout << endl;
		}
//************************************************************************
		if (check == true)
		{
			cout << "good" << endl;
		}
	}

	delete[] str; // CLEAR STR
	cout << endl; 
	STOP_CMD // CONST CMD SYSTEM PAUSE
	return 0; 
}

array