Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семинар 6.docx
Скачиваний:
1
Добавлен:
10.09.2019
Размер:
50.18 Кб
Скачать

Стековая сортировка потоков данных.

Целью занятия является практическое изучение организации множественного наследования в системе программирования С++ на примере сортировки данных с помощью 2-х стеков.

Постановка задачи.  Разработать программу сортировки потока данных с использованием 2-х стеков. Программа должна использоваться как фильтр, который читает поток символов из стандартного ввода (stdin), сортирует принятые символы в порядке возрастания их кодов ASCII и направляет результат в поток стандартного вывода (stdout).

Принцип стековой сортировки.

Для сортировки входного потока символов используются два стека: Lstack и Hstack. Первоначально Lstack инициализируется символом с кодом 0, Hstack инициализируется символом с максимальным кодом 255. В процессе сортировки часть символов сохраняется в стеке Lstack, другая часть - в стеке Hstack. Стек Lstack предназначен для хранения данных в порядке возрастания их величин. В стеке Hstack символы хранятся в порядке убывания их кодов. При этом код символа в вершине стека Lstack не должен превосходить по величине код символа в вершине стека Hstack:

Lstack_top <= Hstack_top

По договоренности новые символы входного потока должен принимать стек Lstack. Для сохранения отношения порядка внутри стеков и между вершинами стеков при поступлении нового символа в стек Lstack, нужно чтобы код принятого символа S был в диапазоне между кодами вершин стеков:

Lstack_top <= S <= Hstack_top

Выполнение этого неравенства можно обеспечить соответствующей перекачкой данных между стеками при поступлении очередного символа из входного потока:

Lstack --> Hstack

Lstack<--Hstack

Когда входной поток будет исчерпан, нужно передать все данные из стека Lstack в стек Hstack:

Lstack --> Hstack.

где они автоматически будут расположены в порядке убывания их величин. Последовательное выталкивание данных из стека Hstack образует выходной поток, где символы располагаются в порядке возрастания их кодов ASCII:

Hstack --> stdout.

Пример стековой сортировки.

Рассмотренный алгоритм иллюстрирует состояние стеков Lstack и Hstack при обработке входной последовательности латинских букв:

m (109) , d (100) , x (120) , f (102) , b (98) , p (112), где в скобках указаны десятичные коды символов.    

1. Начальное состояние:

Lstack: 0

Hstack: 255

2. Состояние после ввода m (109):

Lstack: 0, 109

Hstack:: 255

3. Состояние после ввода d (100):

Lstack: 0, 100

Hstack:: 255, 109

4. Состояние после ввода x (120):

Lstack: 0, 100, 109, 120

Hstack:: 255

            5. Состояние после ввода f (102):

Lstack: 0, 100, 102

Hstack: 255, 120, 109

            6. Состояние после ввода b (98):

Lstack: 0,98

Hstack: 255, 120, 109, 102, 100

            7. Состояние после ввода p (112):

Lstack:0, 98, 100, 102, 109, 112

Hstack: 255, 120

    8. Состояние после завершения ввода:

Lstack:0

Hstack: 255, 120, 112, 109, 102, 100, 98

Печать стека Hstack образует выходную последовательность

b (98), d (100), f (102), m (109), p (112), x (120), где символы упорядочены по возрастанию их кодов ASCII (т. е. по алфавиту).