Сортировки стека подразумевает использование только функций pop и push, можно toptotop
Стек на основе линейного односвязного списка.
struct TInfo{
int chis;
};
struct TElem { // моделирование стека на основе односвязного списка
TInfo Info; // или struct TInfo Info;
TElem *Next; // или struct TElem *Next; здесь и далее
};
TElem* PushStack(TElem *St, TInfo Info){ // добавить элемент в стек
TElem *Elem= new TElem; //Создаем новый указатель Elem типа структуры TElem. По сути это и есть наш новый элемент; выделяем память для нового элемента
Elem->Info.chis = Info.chis;//Записываем необходимое число
Elem->Next = St;//Проводим связь от нового элемента, к вершине.
return Elem; // Адрес новой вершины
}
TInfo PopStack(TElem **PSt){ //извлечь элемент из стека
TElem *Elem = *PSt;
TInfo Info = Elem->Info;
*PSt = Elem->Next;
delete Elem;
return Info;
}
void TopToTop (TElem **PSt1, TElem **PSt3){
TElem *Elem, *StTop=*PSt1, *Dop=*PSt3;
Elem = StTop;
StTop = StTop->Next; // или StTop=(*StTop).Next;
Elem->Next = Dop;
Dop = Elem;
*PSt1 = StTop; *PSt3 = Dop; // сохранить новые адреса вершин по адресам PSt1 и PSt3
return;
}
//Сортировка
void SortStack(TElem *St){
TElem *Dop=NULL;
TInfo inf;
while (St){
inf=PopStack(&St);
while ((Dop) and (Dop->Info.chis >inf.chis)){
St=PushStack(St,PopStack(&Dop));
}
Dop=PushStack(Dop,inf);
}
}
пример выполнения: 2 3 1 -3 перейдет в 2 1 -3
Другие языки программирования и технологии
Помогите, пожалуйста, найти ошибку в программе сортировки стека (по убыванию ) на Си.
Отсортированный стек записывается в Dop и ты его теряешь при выходе из подпрограммы.
void SortStack(TElem **St){
TElem *Dop = NULL;
while (*St) {
TInfo inf = PopStack(St);
while (Dop && Dop->Info.chis > inf.chis) { *St = PushStack(*St, PopStack(&Dop)); }
Dop = PushStack(Dop, inf);
}
*St = Dop;
}
int main()
{
TElem *st = NULL;
TInfo v;
v.chis = 2; st = PushStack(st, v);
v.chis = 3; st = PushStack(st, v);
v.chis = 1; st = PushStack(st, v);
v.chis = -3; st = PushStack(st, v);
SortStack(&st);
while (st) {
cout << PopStack(&st).chis << ' ';
}
return 0;
}
Надо сортировать в другую сторону - замени Dop->Info.chis > inf.chis на Dop->Info.chis < inf.chis
void SortStack(TElem **St){
TElem *Dop = NULL;
while (*St) {
TInfo inf = PopStack(St);
while (Dop && Dop->Info.chis > inf.chis) { *St = PushStack(*St, PopStack(&Dop)); }
Dop = PushStack(Dop, inf);
}
*St = Dop;
}
int main()
{
TElem *st = NULL;
TInfo v;
v.chis = 2; st = PushStack(st, v);
v.chis = 3; st = PushStack(st, v);
v.chis = 1; st = PushStack(st, v);
v.chis = -3; st = PushStack(st, v);
SortStack(&st);
while (st) {
cout << PopStack(&st).chis << ' ';
}
return 0;
}
Надо сортировать в другую сторону - замени Dop->Info.chis > inf.chis на Dop->Info.chis < inf.chis
начнём с того, что это C++, а не Си (т. к. я вижу new и delete), а значит, у тебя нет ни единой причины передавать в функцию двойные указатели, если для этого можно использовать ссылки
если бы это был Си, двойные указатели всё равно нужно было бы выпилить и вместо этого передавать указатель на структуру стека, в свою очередь содержащую единственным полем указатель на голову
так, у тебя в SortStack может понадобиться освободить то, что лежит по St, и тогда внутри функции указатель поменяется, а там, откуда SortStack вызывалась, останется указатель на удалённый мусор
в общем, для начала советую проверить, что сам алгоритм сортировки рабочий, сделать это можно, подставив std::stack вместо самописного стека
если бы это был Си, двойные указатели всё равно нужно было бы выпилить и вместо этого передавать указатель на структуру стека, в свою очередь содержащую единственным полем указатель на голову
так, у тебя в SortStack может понадобиться освободить то, что лежит по St, и тогда внутри функции указатель поменяется, а там, откуда SortStack вызывалась, останется указатель на удалённый мусор
в общем, для начала советую проверить, что сам алгоритм сортировки рабочий, сделать это можно, подставив std::stack вместо самописного стека
Похожие вопросы
- Помогите пожалуйста найти ошибку в задаче (Язык программирования Си)
- Помогите пожалуйста найти ошибку, с++
- Срочно нужна помощь. помогите пожалуйста найти ошибку
- Здравствуйте всем! Помогите пожалуйста найти ошибку в моем коде
- Помогите пожалуйста найти ошибку. Паскаль. Оператор Case of
- Помогите пожалуйста найти ошибку в решении задачи по информатике(паскаль) !!!Прошу очень нужно!!!задача простая!!!
- Pascal помогите пожалуйста найти ошибку в задаче.
- Помогите, пожалуйста, найти ошибки в коде. Нужно выбрать из массива минимальное значение и вывести индексы его позиции.
- Помогите, пожалуйста, с информатикой. 10 класс. Надо найти ошибку в программе. Язык паскаль
- Помогите найти ошибку в задаче, сортировка методом пузырька работает неправильно.