
- •Общие сведения о массивах
- •Алгоритмы инициализации значений элементов массива
- •Инициализации значений элементов массива постоянными значениями
- •Ввод и вывод значений элементов массивов
- •Ввод значений элементов одномерного массива
- •Вывод значений элементов одномерного массива
- •Тестовая программа ввода и вывода одномерного массива
- •Int k; // Текущий предельный размер массива
- •Ввод значений элементов двухмерного массива
- •Вывод значений элементов двухмерного массива
- •Алгоритмы пересылки массивов
- •Пересылка двухмерного массива в одномерный массив
- •Пересылка одномерного массива в двухмерный массив
- •Простые алгоритмы работы с массивами
- •Алгоритм нахождения суммы и среднего арифметического значений элементов одномерного массива
- •Алгоритм нахождения суммы и среднего арифметического значений элементов двухмерного массива
- •Поиск элемента с максимальным и минимальным значениями
- •Поиск в массиве элемента с заданным значением
- •Алгоритм инициализации элементов одномерного массива значениями ряда целых нечетных чисел
- •Формирование единичной матрицы
- •Табуляция функции в массив
- •Организация стека при помощи массива
- •Организация очереди при помощи массива
-
Организация стека при помощи массива
Стек - это список с одной точкой доступа к его элементам, которая называется вершиной стека. Вершину стека обычно обозначают Top. Добавить или убрать элементы можно только через его вершину. Принцип работы стека: "Последним пришел - первым вышел". Пример стека в обычном понимании – детская пирамидка в виде центрального вертикального несъемного стержня, расположенного на подставке. На этот стержень можно насадить диски: первый; второй; третий и т.д. Для того, чтобы снять с пирамидки второй диск, необходимо снять все диски, надетые после надевания третьего диска и третий диск.
Основные операции над стеком: формирование стека, добавление элемента в вершину стека, извлечение элемента из вершины стека, просмотр элементов стека.
При использовании стека могут возникать следующие ситуации, которые приводят к непредсказуемым последствиям: переполнение стека и антипереполнение (попытка извлечения элемента из пустого стека).
Рассмотрим следующую задачу. Пусть требуется ввести некоторую последовательность символов, заканчивающуюся точкой, и напечатать ее в обратном порядке (т.е. если на входе будет "ABcEr-1." то на выходе должно быть "1-rEcBA"). Для реализации алгоритма можно сначала ввести все символы последовательности, записывая их в стек, а затем содержимое стека отпечатать в обратном порядке. Это основная особенность стека – чем позже элемент занесен в стек, тем раньше он будет извлечен из стека.
Рассмотрим программу, реализующую стек на основе одномерного массива. Обратите внимание;
-
на «старую» запись комментариев;
-
на кодирование возвращаемых значений из функций;
-
на кодирование аварийных завершений программы.
Исходный текст программы:
#include "stdafx.h"
#include <conio.h>
#include <locale.h>
#include <stdlib.h>
#define k_Max 100 /* Предельный размер массива */
typedef int Type_Elements_a; /* Тип элементов массива a
стека */
typedef Type_Elements_a Type_a[k_Max]; /* Тип массива a */
Type_a a; /* Сам массив a стека */
int Top; /* Вершина стека */
Type_Elements_a r; /* Вспомогательная переменная */
/* Прототипы функций */
void ClearStack(void); /* Очиска стека */
int PushStack(Type_Elements_a x); /* Помещение элемента в стек */
int PopStack(Type_Elements_a * x); /* Извлечение элемента из стека */
void PrintStack(void); /* Печать содержимого стека */
int _tmain(int argc, _TCHAR* argv[])
{
setlocale( LC_ALL, "russian" ); /* установка русского режима */
printf("Демонстрация работы со стеком\n\n");
/* Очистка стека */
ClearStack();
printf("После очистки:\n");
/* Печать стека */
PrintStack();
/* Заполнение стека */
PushStack(3);
PushStack(2);
PushStack(7);
PushStack(-4);
PushStack(6);
printf("После добавления:\n");
/* Печать стека */
PrintStack();
/* Удаление из стека */
PopStack(&r);
printf("Считано и удалено из стека: %d\n", r);
PopStack(&r);
printf("Считано и удалено из стека: %d\n", r);
printf("После удаления:\n");
/* Печать стека */
PrintStack();
/* Заполнение стека */
PushStack(5);
/* Печать стека */
printf("После добавления:\n");
PrintStack();
/* Завершение выполнения программы */
printf("\nНажмите любую клавишу\n");
_getch();
return 0;
}
/* Функции работы со стеком */
void ClearStack(void)
/* Очиска стека */
{
Top = 0;
}
int PushStack(Type_Elements_a x)
/* Помещение элемента в стек */
{
if ((Top > k_Max))
{
/* Аварийное завершение программы */
printf("\nПереполнение стека\n");
printf("\nНажмите любую клавишу\n");
_getch();
exit(-1);
}
a[Top] = x;
Top = Top + 1;
return 0;
}
int PopStack(Type_Elements_a * x)
/* Извлечение элемента из стека */
{
if ((Top == 0))
{
/* Аварийное завершение программы */
printf("Попытка извлечения из пустого стека\n");
printf("\nНажмите любую клавишу\n");
_getch();
exit(-1);
}
* x = * (a + Top - 1); /* x = a[Top]; */
Top = Top - 1;
return 0;
}
void PrintStack(void)
/* Печать содержимого стека */
{
if ((Top > 0))
{
/* То стек не пустой */
printf("Содержимое стека\n");
/* Задание i - номеров элементов стека в обратном порядке */
for(int i = Top - 1; i >= 0; i--)
printf("%d) %d\n", i, a[i]); /* a[i] */
}
else
printf("Стек пустой...\n");
}