//Стек моделируется при помощи динамического массива указателей на линейные массивы размерности N целых.
//Указатель стека – два индекса – в массиве указателей и линейном массиве.
//В операции push при переполнении текущего линейного массива в массив указателей добавляется новый,
//если операция pop переходит к предыдущему массиву, то текущий утилизуется.
#include <iostream>
using namespace std;
const int N = 3;
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] = new int[M];
for (j = 0; j < M; j++)
{
sArr[i][j] = 0;
}
}
sPtr1 = sPtr2 = 0;
}
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) * (sPtr2 + 1) <= sSize)
{
if (sPtr2 == 2)
{
sPtr1 += 1;
sPtr2 = 0;
}
else
{
sPtr2++;
}
sArr[sPtr1][sPtr2] = x;
}
else
{
sArr[(sSize / M) + 1] = new int[M];
sArr[(sSize / M) + 1][0] = x;
cout << "Massive increased" << endl;
sPtr1 += 1;
sPtr2 = 0;
sSize += M;
}
}
void Pop()
{
if (sPtr2 > 0)
{
cout << sArr[sPtr1][sPtr2--];
}
else if (sPtr2 == 0)
{
cout << sArr[sPtr1][sPtr2];
delete sArr[sPtr1];
sPtr1--;
sPtr2 = M - 1;
sSize -= M;
}
}
int show()
{
// int k1, k2;
for (int i = 0; i < sSize; i++)
{
cout << sArr[i / M][i % M];
}
}
int main() {
setlocale(LC_ALL, "Russian");
int **pp = new int*[N];
int q;
for (int i = 0; i < N; i++)
{
pp[i] = NULL;
}
int choose;
label:
cout << "1) Инициализировать стэк" << endl;
cout << "2) Положить символ в стэк" << endl;
cout << "3) Взять символ из стэка" << endl;
cout << "4) Показать стэк" << endl;
cout << "0) Выйти" << endl;
cin >> choose;
switch(choose)
{
case 1:{InitStack(); goto label;}
case 2:
{
cout << "Введите число" << endl;
cin >> q;
push(q);
goto label;
}
case 3:{Pop(); goto label;}
case 4:{ goto label;}
case 0:{goto labelend;}
}
labelend:
for (int i = 0; i < N; i++)
{
pp[i] = NULL;
}
delete[]pp;
}