Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <windows.h>
- typedef double TInfo;
- struct TElem {
- TInfo Info; // информация в стеке
- struct TElem* Next; // указатель на следующий элемент стека
- };
- TInfo PopStack(TElem** stack) { // извлечь информацию из стека и удалить элемент
- TElem* Elem = *stack; // создаем копию вершины переданного стека
- TInfo Info = Elem->Info; // сохраняем в Info данные последнего введенного эл-та
- *stack = Elem->Next; // ставим указатель на следующий эл-т(удаляя тем самым предыдущий)
- delete Elem; // удаляем доп. стек
- return Info; // возвращаем Info
- }
- TElem* push_stack(TElem* stack, TInfo info) { // добавить в стек
- if (stack == NULL) { // если стек нулевой, то
- TElem* Elem = (TElem*)malloc(sizeof(TElem)); // создаем новый элемент
- Elem->Info = info; // передаем в него информацию
- Elem->Next = NULL; // перед новым элеиентом ничего нет
- return Elem; // возвращаем созданный элемент
- }
- else { // иначе
- TElem* Elem = (TElem*)malloc(sizeof(TElem)); // создаем новый элемент
- Elem->Info = info; // передаем в него информацию
- Elem->Next = (stack); // указывает на предыдущий элемент
- return Elem; // возвращаем созданный элемент
- }
- }
- void TopToTop(TElem** PSt1, TElem** PSt2) {
- // перекладывание элемента из одного стека (StTop) в другой(Dop)
- TElem* Elem, * StTop = *PSt1, * Dop = *PSt2; // создаем копии стеков
- Elem = StTop; // Elem - доп. копия первого стека
- StTop = StTop->Next; // ставим указатель на следующий элемент
- Elem->Next = Dop; // добавляется верхний элемент из первого стека во второй(сохраняется в дополнит. стеке)
- Dop = Elem; // второй стек равняеется дополнит. стеку (верх. элем. первого + второй стек)
- *PSt1 = StTop; *PSt2 = Dop; // сохранить новые адреса вершин по адресам PSt1 и PSt2
- }
- void create_stack(TElem** stack, FILE* f, int* kol) { // заполнить стек информацией
- double info;
- (*stack) = NULL; // изначально: пустой
- while (!feof(f)) { // пока не достиг конца файла
- fscanf(f, "%lf", &info); // считать информацию из файла и записать в info
- if (ftell(f) != 0) { // если файл не пустой
- (*stack) = push_stack(*stack, info); // записать информацию в стек
- (*kol)++; // подсчет количества элементов стека
- }
- }
- }
- void print_c(TElem* stack) { // вывод стека в консоль
- TElem* Elem = stack; // создаем копию вершины переданного стека
- if (!Elem) printf(" пустой."); // если пустой, то выводим соответствующее сообщение
- else { // иначе
- printf("\n");
- while (Elem) { // пока не пустой
- printf("%lf ", Elem->Info); // печатаем информацию
- Elem = Elem->Next; // переходим к следующему элементу
- }
- }
- printf("\n");
- }
- void print_f(TElem* stack, FILE* f) { // вывод стека в файл
- TElem* Elem = stack; // создаем копию вершины переданного стека
- if (!Elem) fprintf(f, " пустой."); // если пустой, то выводим соответствующее сообщение
- else { // иначе
- fprintf(f, "\n");
- while (Elem) { // пока не пустой
- fprintf(f, "%lf ", Elem->Info); // печатаем информацию
- Elem = Elem->Next; // переходим к следующему элементу
- }
- }
- fprintf(f, "\n");
- }
- TElem* free_stack(TElem** stack) { // освободить стек
- TInfo Info;
- while (*stack) { // пока стек не пустой
- Info = PopStack(stack); // извлекается информация и удаляется элемент
- }
- return *stack; // возвращаем пустой стек
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement