#include <windows.h> // SetConsoleOutputCP, SetConsoleCP
#include <stdio.h> //printf , fgets
#include <conio.h> // getch
#include <string.h> // strcpy, strncmp, strchr
//---------------------------------------------------------------------------
struct TInfo{
char Symbol[4];
};
struct TElem { // моделирование стека на основе односвязного списка
TInfo Info; // или struct TInfo Info;
TElem *Next; // или struct TElem *Next; здесь и далее
};
//-----------------------прототипы-------------------------------------------
TElem* PushStack(TElem *St, TInfo Info); // добавить элемент в стек
TInfo PopStack(TElem **PSt); //извлечь элемент из стека
// дополнительная процедура перекладывания элемента из одного стека (StTop) в другой(Dop)
void TopToTop (TElem **PSt1, TElem **PSt2); // без изменения адресов элементов, только связи
//----------первая часть: создание стека из текстового файла
TElem* CreateStack(TElem *St);
//----------вторая часть: вывод стека на экран ------
void OutputStack(TElem *St, int k);
//----------третья часть: решение задачи -------------
TElem* Decide(TElem **PSt1, TElem *St2); //решение, для закидывания латиницы
//----------четвертая часть: освобождение памяти -----
TElem* FreeStack(TElem *St);//очищение стака
//---------------------------------------------------------------------------
int main()
{
TElem *StackTop1=NULL, //исходник
*StackTop2=NULL; //получившийся
char ch; //контрольный символ(1,2,3,4,5)
int k; //флажок
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
do{
printf("\n1 - создать новый стек; 2 - вывод; 3 - решение; 4 - освободить; \
5 - конец.\nВаш выбор? ");
ch=getchar(); fflush(stdin);
ch=toupper(ch);
switch (ch) {
//----------первая часть: создание стека из текстового
case '1': if (StackTop1) {
printf("Error: сначала надо освободить память!"); break;
}
StackTop1 = CreateStack(StackTop1);
break;
//----------вторая часть: вывод стеков на экран ------
case '2': printf("Первый стек:\n"); OutputStack(StackTop1,k);
printf("\nВторой стек:\n"); OutputStack(StackTop2,k);
break;
//----------третья часть: решение задачи -------------
case '3': StackTop2 = Decide(&StackTop1, StackTop2); //&StackTop1-ссылка на вводимый стек
printf("\nВсе раскидано по стекам,если задан начальный, для просмотра - 2\n");
break;
//----------четвертая часть: освобождение памяти -----
case '4': StackTop1=FreeStack(StackTop1);
StackTop2=FreeStack(StackTop2);
printf("Вся память под стеки особождена\n");
break;
//-----------------------выход------------------------
case '5': return 0;
default:
printf("Нет такой команды\nPress any key");
getch();
}
} while (ch!='5');
return 0;
}
//---------------------------------------------------------------------------
TElem* PushStack(TElem *St, TInfo Info){ // добавить элемент в стек
TElem *Elem= new TElem;
strcpy(Elem->Info.Symbol, Info.Symbol);
Elem->Next = St;
return Elem; // Адрес новой вершины
}
TInfo PopStack(TElem **PSt){ //извлечь элемент из стека
TElem *Elem = *PSt;
TInfo Info = Elem->Info;
*PSt = Elem->Next;
delete Elem;
return Info;
}
// дополнительная процедура перекладывания элемента из одного стека (StTop) в другой(Dop)
void TopToTop (TElem **PSt1, TElem **PSt2){
TElem *Elem, *StTop=*PSt1, *Dop=*PSt2;
Elem = StTop;
StTop = StTop->Next; // или StTop=(*StTop).Next;
Elem->Next = Dop;
Dop = Elem;
*PSt1 = StTop; *PSt2 = Dop; // сохранить новые адреса вершин по адресам PSt1 и PSt2
return;
}
//----------первая часть: создание стека из текстового
TElem* CreateStack(TElem *St){
int kol=0;
char *n,*r;
TInfo Info;
printf("Создайте стек, чтобы закончить его пропишите end\n");
while(1){
fgets(Info.Symbol,4,stdin); fflush(stdin);
if (strcmp(Info.Symbol, "end")==0) break;
St = PushStack(St, Info);
kol++;
}
printf("Создан стек из %d элементов\n", kol);
printf("Press any key to continue");
getch();
return St;
}
//----------вторая часть: вывод стека на экран ------
void OutputStack(TElem *St, int k){
TElem *Dop=NULL;
while (St){
printf("%s \n", St->Info.Symbol);
TopToTop(&St, &Dop);
}
while(Dop) TopToTop(&Dop, &St);
printf("Press any key to continue");
getch();
return;
}
//----------третья часть: решение задачи -------------
TElem* Decide (TElem **PSt1, TElem *St2){
TElem *St1= *PSt1, *Dop=NULL, *DopDop=NULL;
St2 = FreeStack(St2);
int k=0, g=atoi(St1->Info.Symbol);
while (St1){
if (strcmp(St1->Info.Symbol,"0")==0 || atoi(St1->Info.Symbol)!=NULL){
if (atoi(St1->Info.Symbol)!=g ){St2=PushStack(St2, St1->Info);g=atoi(St1->Info.Symbol);TopToTop(&St1, &Dop); }
else {TopToTop(&St1, &Dop);}
}
else {TopToTop(&St1, &Dop);}
}
while(Dop) TopToTop(&Dop, &St1);
*PSt1 = St1; // новый адрес через параметр (изменение по адресу)
return St2;// новый адрес через результат функции вернется
}
//----------четвертая часть: освобождение памяти -----
TElem* FreeStack(TElem *St){
TInfo Info;
while (St){
Info = PopStack(&St);
}
return St;
}
//---------------------------------------------------------------------------