Quick actions

cmd+k|ctrl+k

Navigation

Languages

LangProgLaba3N6

Snippet info

Language

Cpp

Visibility

public

Author

homiecage

Created

2017-04-17T07:39:11Z

Updated

2017-05-22T12:35:50Z

//Стек моделируется при помощи динамического массива указателей на линейные массивы размерности N целых.
//Указатель стека – два индекса – в массиве указателей и линейном массиве.
//В операции push при переполнении текущего линейного массива в массив указателей добавляется новый,
//если операция pop переходит к предыдущему массиву, то текущий утилизуется.
//#include "stdafx.h"
#include <iostream>
using namespace std;

const int N = 5;
const int M = 3;

int **sArr;
int sPtr1;
int sPtr2;
int sSize;

void InitStack()//инициализация массива
{
	int i, j;
	//int p;
	//sSize = n;
	//p = n / M;
	sSize = N * M;
	sArr = new int*[N];
	for (i = 0; i < N; i++)
	{
		sArr[i] = NULL;
	}
	sPtr1 = -1;
	sPtr2 = -1;
}

void DestroyStack()//Удалить стэк
{
	sArr = NULL;
	delete[] sArr;
}

int isEmptyS()//Проверка на пустоту
{
	if (sPtr1 == 0 && sPtr2 == 0)
		return -1;
	else
		return 0;
}

void Push(int x)
{
	//sPtr1 = sSize / M;
	//sPtr2 = sSize % M - 1;
	if (sPtr1 == -1)
	{
		sArr[++sPtr1] = new int[M];
		sPtr2 = -1;
	}
	if ((sPtr1 * M + sPtr2 + 1) <= sSize)
	{
	    
		if (sPtr2 == M - 1)
		{
			sPtr1 += 1;
			sPtr2 = 0;
			sArr[sPtr1] = new int[M];
		}
		else
		{
			sPtr2++;
		}

		sArr[sPtr1][sPtr2] = x;
	}
	else
	{
		sArr[sPtr1] = new int[M];
		sArr[sPtr1][0] = x;
		cout << "Massive increased" << endl;
		sPtr1 += 1;
		sPtr2 = 0;
		sSize += M;
	}
}

void Pop()
{
	if (sPtr1 == -1)
	{
		cout << "Stack is empty" << endl;
		return;
	}

	if (sPtr1 >= 0 && sPtr2 > 0)
	{
		cout << sArr[sPtr1][sPtr2] << endl;
		sPtr2--;
	}
	else if (sPtr2 == 0)
	{
		cout << sArr[sPtr1][sPtr2] << endl;
		sArr[sPtr1--] = NULL;
		sPtr2 = M - 1;
	}
}

void Show()
{
	//int k1, k2;
	int k;
	for (int i = 0; i < sPtr1 * M + sPtr2 + 1; i++)
	{
		if ((i % M)==0){cout << endl;}
		cout << sArr[(int) (i / M)][i % M] << "  ";
	}
	if (sArr[0] == NULL)
	{
		sPtr2 = -1;
		cout << endl << sPtr1 << "  " << sPtr2 << endl;
		return;
	}
	cout << endl << sPtr1 << "  " << sPtr2 << endl;
	cout << endl;
}
int main() {
	setlocale(LC_ALL, "Russian");
	int **pp = new int*[N];
	int q;
	for (int i = 0; i < N;i++)
	{
		pp[i] = NULL;
	}
	InitStack();
	int choose;
label:
	cout << "1) Положить символ в стэк" << endl;
	cout << "2) Взять символ из стэка" << endl;
	cout << "3) Показать стэк" << endl;
	cout << "0) Выйти" << endl << endl;
	cin >> choose;
	switch (choose)
	{
	case 1:
	{
			  cout << "Введите число" << endl;
			  cin >> q;
			  Push(q);
			  goto label;
	}
	case 2:{Pop(); goto label; }
	case 3:{Show(); goto label; }
	case 0:{goto labelend; }

	}

labelend:
	for (int i = 0; i < N;i++)
	{
		pp[i] = NULL;
	}
	delete[]pp;
}
INFO