LangProgLaba3N6

Run Settings
LanguageC++
Language Version
Run Command
//Стек моделируется при помощи динамического массива указателей на линейные массивы размерности 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; }
Editor Settings
Theme
Key bindings
Full width
Lines