Стековая сортировка потоков данных.
Целью занятия является практическое изучение организации множественного наследования в системе программирования С++ на примере сортировки данных с помощью 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 (т. е. по алфавиту).
