Программный код
#include <iostream>
using namespace std; //чтобы каждый раз не писать std::
struct stack_element
{
float value;
stack_element *previous;
};
//функция, добавляющая новый элемент в список (стек). Элемент введенный пользователем в качестве первого на самом деле будет уже вторым, т.к первый мы создаем в main() с пустым адресом предыдущего
void paste(float VALUE, stack_element *&TOP)
{
stack_element *NewTOP = new stack_element;
NewTOP->value = VALUE
NewTOP->previous = TOP;
TOP = NewTOP;
}
//функция удаления одного верхнего (вершины, головы) элемента стека
void cut(stack_element *&TOP)
{
cout <<"\n";
float temp = TOP->value;
stack_element *cut_elem = TOP;
TOP = TOP->previous;
delete cut_elem;
cout <<"Deleting top-element = " << temp;
cout <<"\n";
}
//функция очистки стека - удаляет все элементы стека, кроме служебного - самого первого добавленного с пустым адресом
void clear(stack_element *&TOP
{
if (TOP->previous != 0)
{
cout <<"\n"<<"Clearing stack..."<<"\n"; //пишем, что делаем этой процедурой - чистим стек
stack_element *element = 0;
while (TOP->previous != 0
{
element = TOP
TOP = TOP->previous;
delete element
}
cout <<"done. Stack is empty"<<"\n"; //говорим, что стек очищен
}
else
{
cout <<"Stack is empty"<<"\n"; //говорим, что стек итак пуст
}
}
void show(stack_element *TOP)
{
cout <<"\n";
cout <<"Viewing stack data...";
if (TOP->previous != 0)
{
stack_element *element = TOP;
cout <<"\n";
while (element->previous != 0)
{
cout <<"(" << element->value << "),";
element = element->previous;
}
} else cout <<"\n" << "Stack is empty";
cout <<"\n";
}
int main(int argc, char** argv) {
int N; //Число элементов в список
float value; //Элементы вводимые в список
string c;
stack_element *HEAD = new stack_element;
HEAD->previous = 0;
cout << "------------ Stack (LIFO) implementation ------------ "<<"\n";
cout << "Enter command:"<<"\n"<<"e - exit,"<<"\n"<<"p - paste stack element,"<<"\n"<<"c - cut stack element,"<<"\n"<<"s - show stack,"<<"\n"<<"d - delete stack."<<"\n";
while (c!="x")
{
cout << "command> "; //выводим приглшение
cin >> c; //спрашиваем команду
if (c == "p") //ввели р
{
cout << "Enter the number of items to paste = ";
cin >> N; //Указали сколько элементов вводить в список
for (int i=0; i<N; i++)
{
cout << "element #" << i+1 << " = ";
cin >> value; //Ввод x с клавиатуры
paste(value,HEAD); //Добавление элемента в список путем передачи в функцию paste: value с клавиауры и указателя HEAD с адресом ячейки последнeго добавленного элемента - вершины (или головы)
}
}
else
if (c=="c")
{
cout << "Enter the number of items to cut = ";
cin >> N; //Указали сколько элементов удаляем
for (int i=0; i<N; i++)
{
if (HEAD->previous != 0) //если вершина не является самым первым служебным элементом с нулевым адресом в указателе
{
cut(HEAD); //то удаляем очередной i-элемент
}
else //если доудалялись до самого первого служебного элемента с нулевым адресом в указателе
{
cout <<"Stack is empty"<<"\n";//говорим, что стек пуст
i = N; //выходим из цикла досрочно
}
}
}
else
if (c=="s")
{
show(HEAD);
}
else
if (c=="d")
{
clear(HEAD);
}
else
if (c=="e")
{
c = "x";
if (HEAD->previous != 0) //если стек не пуст, то очищаем его перед выходом, кроме первого служебного элемента
{
clear(HEAD);
}
cout << "\n"<<"Bye!"<<"\n";
}
else
{
cout << "\n"<<"Bad command"<<"\n";
}
}
delete HEAD->previous; //удаляем служебный элемент, который может снова стать корнем в результате манипуляций со стеком
delete HEAD;//удаляем служебный элемент
cin.get();
cin.get();
return 0;
}