// .cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
struct item //
{
int data;
item* point;
};
void got (int,int); //прототип функции обработки данных из входного файла
// Глобальные переменные - их функция обработки типа операции будет использовать
int i=0, num_add, num_iadd, num_del, num_idel, N;
item *first=0, *tek; //последний и новый
int _tmain(int argc, _TCHAR* argv[])
{
FILE* in; // текстовый файл
FILE* out;
int x=1, el; //тут мы храним тип и содержание операции из входного файла перед обработкой
out = fopen( "output.txt", "wt" );//Создание выходного файла
if ( out == NULL ) {printf( "Bad output\n" ); getchar(); return 1;}
in = fopen( "input.txt", "rt");//Открытие входного файла
if ( in == NULL ) {printf( "Bad input\n" ); getchar(); return 1;}
if (fscanf(in,"%d", &N)==NULL){fprintf(out,"Bad input(No N)\n"); return 1;};
if (N < 1) { fprintf(out,"Bad input(N<1)\n"); return 1; } //Считываем число элементов
while ((x!=0)&&(!feof( in )))
{
if (fscanf(in, "%d", &x)==NULL){fprintf(out,"Bad input(No N)\n"); return 1;};
if (x==2) //Если попалось исключение
{
got(x,0); //то сразу его и обрабатываем
}
else //если же добавление,
{
if (fscanf(in, "%d", &el)==NULL){fprintf(out,"Bad input(No N)\n"); return 1;}; //то сначала почитаем содержимое, для вставки
got(x,el); // а теперь обработаем его
}
};
fclose( in ); // закрыть файл
//выводим все требуемые надписи
fprintf(out,"ВЫПОЛНЕНО %d ОПЕРАЦИЙ ВКЛЮЧЕНИЯ В СТЕК\n", num_add);
fprintf(out,"ПРОИГНОРИРОВАНО %d ОПЕРАЦИЙ ВКЛЮЧЕНИЯ В СТЕК\n", num_iadd);
fprintf(out,"ВЫПОЛНЕНО %d ОПЕРАЦИЙ ИСКЛЮЧЕНИЯ ИЗ СТЕКА\n", num_del);
fprintf(out,"ПРОИГНОРИРОВАНО %d ОПЕРАЦИЙ ИСКЛЮЧЕНИЯ ИЗ СТЕКА\n", num_idel);
fprintf(out,"УКАЗАТЕЛЬ СТЕКА %d\n", i);
i=0;
tek=first;
while (tek)
{
fprintf(out,"%d\n", tek->data);
i++;
tek=tek->point;
};
fclose( out ); // закрыть файл
delete first; delete tek;
return 0;
}
void got (int type, int cont) //обработка входных данных
{
if (type==1) // вставка
{
if (i/и стек не заполнен
{
tek = new item; //заполняем
tek->data=cont;
tek->point=first;
first=tek;
i++; //увеличиваем текущий размер
num_add++; //считаем количесво успешных добавлений
}
else //если стек уже полон,
{
num_iadd++; //ничего не делаем, только считаем количесвто неудачных добавлений
}
}
else
{
if (type==2) //исключение из стека
{
if (i!=0) //и стек не пустой
{
i--; //уменьшаем размер, а заодно и указатель стека
tek=first;
first=first->point;
delete tek;
num_del++; //считаем удачные исключения
}
else // пустой стек
{
num_idel++; //считаем неудачные исключения
}
}
}
return;
}