//Стек моделируется при помощи динамического массива указателей на линейные массивы размерности 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;
}