Все операции со стеком
Структура данных стека. Принципы выборки и записи в стек описаны выше.
// Работа со стеком. Проверка, пуст ли стек.
// Добавить в стек. Выбрать из стека.
// Стек полон
#include <stdio.h>
#include <dos.h>
#include <iostream.h>
#include <Process.H>
#include <Stdlib.H>
#include <conio.H>
#define max_size 200
char s[max_size]; //компоненты стека
int next=0; // позиция стека
int Empty()
{ return next==0; }
int Full()
{ return next==max_size; }
void Push()
{
if (next==max_size)
{
cout<<"Ошибка: стек полон"<<endl;}
else { next++;cout<<"Добавлен"<<endl;
cout<<"Что поместить в стек?"<<endl;
cin >> s[next-1];
}
}
void OUTst()
{
int i=0;
if (next==0) {
cout<<"Cтек пуст"<endl;
}
else { for(i=0;i<next;i++)
cout<<s[i]<<" "<<endl;
}
}
void Clear()
{ next=0; }
Poz()
{ return next; }
void Del()
{
int a;
if (next==0) cout<<"Ошибка: стек пуст"<<endl;
else {
next--;cout<<"Удален "<<endl;
}
}
void menu()
{
cout<<"0: распечатать стек"<<endl;
cout<<"1: добавить в стек"<<endl;
cout<<"2: удалить из стека"<<endl;
cout<<"3: узнать номер позиции в стеке"<<endl;
cout<<"4: узнать, пуст ли стек"<<endl;
cout<<"5: узнать, полон ли стек"<<endl;
cout<<"6: очистить стек"<<endl;
cout<<"7: выход"<<endl;
}
main()
{
char c;
clrscr();
textcolor(15);
do {
menu();
cin >> c;
clrscr();
switch (c) {
case '0':OUTst();getch();break;
case '1':Push();break;
case '2':Del();getch();break;
case '3':cout<<
"Hомер "<<Poz()<<endl;getch();break;
case '4':if (Empty()==1) cout<<"Пуст"<<endl;
else cout<<"Hе пуст"<<endl;getch();break;
case '5':if (Full()==1)cout<<"Полн"<<endl;
else cout<<"Hе полн"<<endl;getch();break;
case '6':Clear();cout<<
"Стек очищен"<<endl;getch();break;
case '7':exit(1);
}
delay(200);
}
while (c!=7);
return 0;
}
Подведем итог
Следует обратить внимание на самый существенный момент: программы нужно проектировать, а не создавать их методом проб и ошибок. Мы должны внимательно подумать о форме и содержании ввода и вывода для программы. Необходимо разделить программу на хорошо определенные задачи, затем раздельно запрограммировать, принимая во внимание их взаимодействие друг с другом. Идея заключается в достижении модульности. Если необходимо, разбивайте модули на еще более мелкие модули. Используйте функции для повышения степени модульности и простоты программы.
При проектировании программы попытайтесь предвидеть, что может идти неправильно, и программируйте, исходя из этого. Используйте локализацию ошибок, чтобы контролировать действия в местах потенциальных затруднений, или, по крайней мере, предупреждать пользователя, что может возникнуть осложнение. Гораздо лучше дать пользователю еще одну возможность ввести данные, чем продолжать выполнять программу и прийти к аварийной ситуации. Если создается функция, сначала определите, как она будет взаимодействовать с вызывающей программой. Решите также, какая информация будет входить в нее, а какая - выходить. Какими должны быть аргументы? Если вы примете во внимание все эти параметры, то можете обратить внимание на работу самой функции. Используйте эти идеи, и ваша программа будет более надежной и менее подверженной аварийным ситуациям. Вы получите тело функции, которое сможете применять в других программах. Программирование в таком случае потребует меньше времени. Не забывайте о классах памяти. Переменные можно определять вне функции. В этом случае их называют внешними или глобальными и они доступны более чем для одной функции. Переменные, определенные внутри функции, являются локальными для нее, и не известны другим функциям. Если можно, используйте автоматическую разновидность локальных переменных. Они охраняют переменные одной функции от взаимодействия других функций.