Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 04.06.2012
Сообщений: 9

Сортировка стека методом вставки

04.06.2012, 18:53. Показов 6874. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан стек реализованный статически.
Неоходимо написать функцию вставки в него элемента с сохранением порядка элементов.
То есть после вставки стек должен быть отсортирован.
Сортировка стека должна быть осуществлена методом вставки.
Использовать статические свойства стека нельзя, то есть можно использовать только свойства стека как структуры.

Будет ли сортировкой вставкой использование ханойских башен?
Если да, то на что дальше следует обратить внимание?
Заранее спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.06.2012, 18:53
Ответы с готовыми решениями:

Сортировка массива по возрастанию методом "вставки с бинарным поиском места вставки"
Задан массив вещественных чисел x0,x1,...,xn-1. Произвести сортировку массива по возрастанию методом «вставки с бинарным поиском места...

Сортировка массива пузырьковым методом и методом вставки
нужно написать программу которая будет делать сортировку этими способами в массиве 3x10, две кнопки, таблица (3х10), собственно...

Сортировка методом вставки
Сортировка методом вставки. Помогите изменить реализацию так, чтобы осуществлялась сортировка четных элементов массива (т.е. с четными...

7
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
04.06.2012, 20:09
Не факт, что я правильно понял задание, но стек лучше реализовать в классе в котором содержится функция вставки и вывода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream> 
using namespace std; 
 
class Stack    // класс стек
{ 
private: 
    static const int MAX = 10; // размер
    int st[MAX]; 
    int top; 
public: 
    Stack() 
    { top = 0; } 
    void push (int var ) // функция вставки
    { st [++top] = var; } 
    int pop() 
    { return st[top--]; } // функция вывода
}; 
 
int main()
{   
    Stack s1;
 
    s1.push(11); 
    s1.push(22);    
    s1.push(33);    
    s1.push(44);    
    s1.push(55);    
    s1.push(66); 
    cout << s1.pop() << endl;
    cout << s1.pop() << endl;   
    cout << s1.pop() << endl;   
    cout << s1.pop() << endl;   
    cout << s1.pop() << endl;   
    cout << s1.pop() << endl;  
 
}
0
0 / 0 / 0
Регистрация: 04.06.2012
Сообщений: 9
04.06.2012, 21:23  [ТС]
Извините, но пока знаком только с си.
Еще раз напишу задание, написал действительно ацкий ад)
Дан стек отображенный на массив.
Необходимо написать процедуру, вставляющую элемент в стек (упорядоченный по возрастанию) с сохранением порядка.
Для сортировки использовать метод сортировки простой вставки.
П.С. нельзя использовать статические свойства стека(реализацию). По возможности использовать рекурсию.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
04.06.2012, 23:00
Если правильно понял то так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <stdlib.h>
#include <stdio.h>
 
 
#define MAX_STACK_SIZE 128
 
typedef struct {
   int buffer[MAX_STACK_SIZE];
   size_t top;
} stack_t;
 
void init_stack(stack_t * stack) {
   stack->top = 0;
}
 
int empty_stack(stack_t const* stack) {
   return stack->top == 0;
}
 
int top_stack(stack_t const* stack) {
   return stack->buffer[stack->top - 1];
}
 
void pop_stack(stack_t * stack) {
   --stack->top;
}
 
void push_stack(stack_t * stack, int value) {
   stack->buffer[stack->top++] = value;
}
 
void push_sorted_stack(stack_t * stack, int value) {
   int top;
   
   if (!empty_stack(stack)) {
      top = top_stack(stack);
      
      if (top > value) {
         pop_stack(stack);
         push_sorted_stack(stack, value);
         push_stack(stack, top);
         return;
      }
   }
   
   push_stack(stack, value);
}
 
void print_stack(stack_t const* stack) {
   size_t i;
   
   for (i = 0; i != stack->top; ++i) {
      printf("%d ", stack->buffer[i]);
   }
   printf("\n");
}
 
 
int main() {
   stack_t sorted;
   stack_t unsorted;
   int i;
   
   init_stack(&unsorted);
   for (i = 9; i != 0; --i) {
      push_stack(&unsorted, (i * 17) % 25);
   }
   printf("unsorted: ");
   print_stack(&unsorted);
   
   init_stack(&sorted);
   for (i = 9; i != 0; --i) {
      push_sorted_stack(&sorted, (i * 17) % 25);
   }
   printf("sorted:   ");
   print_stack(&sorted);
 
   return EXIT_SUCCESS;
}
http://liveworkspace.org/code/... 59413bcd0c
2
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.06.2012, 13:05
Цитата Сообщение от Morozy4 Посмотреть сообщение
То есть после вставки стек должен быть отсортирован.
А если вставить среднее? Получается, в середину? Это уже не стек.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
05.06.2012, 18:09
Цитата Сообщение от taras atavin Посмотреть сообщение
Это уже не стек.
Я так понял нужна приоритетная очередь на основе стека.
1
0 / 0 / 0
Регистрация: 04.06.2012
Сообщений: 9
06.06.2012, 18:53  [ТС]
Спасибо за помощь)
Можно еще уточнить алгоритм самой сортировки?
Правильно понял эту функцию?

void push_sorted_stack(stack_t * stack, int value) {
int top;

if (!empty_stack(stack)) {
top = top_stack(stack);

if (top > value) {
pop_stack(stack);
push_sorted_stack(stack, value);
push_stack(stack, top);

return;
}
}

При вставке элемента в стек идет проверка, не меньше ли вставляемый элемент последнего элемента стека. Если вставляемый элемент меньше верхнего, то верхний извлекается и перегоняется в дополнительный стек, далее все тот же вставляемый элемент проверяется с новым верхним элементом.
Так до тех пор пока вставляемый не будет больше верхнего, и затем все изъятые элементы добавляются в стек?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
06.06.2012, 19:51
Ну да, только дополнительный стек явно не задаётся, он получается за счёт рекурсивных вызовов. Так то, если без рекурсии, всё выглядит проще: снимаешь из стека до нужного места, кладёшь элемент, кладёшь всё снятое обратно. Примерно так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void push_sorted_stack(stack_t * stack, int value) {
   stack_t values;
   int top;
 
   init_stack(&values);
 
   while (!empty_stack(stack)) {
      top = top_stack(stack);
      if (top <= value) {
         break;
      }
      push_stack(&values, top);
      pop_stack(stack);
   }
 
   push_stack(stack, value);
 
   while (!empty_stack(&values)) {
      push_stack(stack, top_stack(&values));
      pop_stack(&values);
   }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.06.2012, 19:51
Помогаю со студенческими работами здесь

Сортировка методом вставки
В файле input.txt содержатся сведения о группе студентов в формате: номер группы; запись о каждом студенте группы содержит следующие...

Сортировка методом вставки
Здравствуйте. Полностью задание писать не буду, напишу то, что входит в его суть (и код тоже соответствующий). В текстовом документе...

Сортировка массива методом вставки
Может кто-нибудь, построчно объяснить код предложенный ниже.И каким образом у нас будет сортироваться 2 в массиве 1 3 5 7 2? #include...

Сортировка методом центрированной вставки
Доброго времени суток. Может у кого-нибудь есть пример на С++ этой сортировки? Буду рад поглядеть) В интернете не нашел примеров)

Сортировка диагоналей матрицы методом вставки
В общем нужно сортировать методом вставки диагонали, параллельные главной по убыванию Код сделан на половину, отлично сортирует...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru