Печать текста: схема обхода
while (1)
{
if (pLink != NULL)
{
cout << pLink->Str; // обработка звена
St.push(pLink); // запись в стек
pLink = pLink->pDown; // переход на подуровень
}
else if (St.empty())
break;
else
{
pLink = St.top();
St.pop(); // выборка из стека
pLink = pLink->pNext; // переход по тому же уровню
}
}
Ввод текста из файла: уровень текста в файле можно выделить строками специального вида (например, скобками '{' и '}')
Общая схема алгоритма:
повторить:
ввод строки
ЕСЛИ '}' ТО Завершить
ЕСЛИ '{' ТО Выполнить рекурсивно Ввод_текста
Добавить строку на том же уровне
Реализация итератор:
int TText::Reset(void) // Установка на корневое звено текста
{
pCurrent = pFirst;
if (pCurrent != nullptr)
{
St.push(pCurrent);
if (pCurrent->pNext != nullptr)
St.push(pCurrent->pNext);
if (pCurrent->pDown != nullptr)
St.push(pCurrent->pDown);
}
}
bool TText::IsTextEnded(void) const // Стек пуст?
{
return St.empty();
}
bool TText::GoNext(void) // Переход к следующему звену текста
{
if (!IsTextEnded())
{
pCurrent = St.top();
St.pop();
if (pCurrent != pFirst)
{
if (pCurrent->pNext != nullptr)
St.push(pCurrent->pNext);
if (pCurrent->pDown != nullptr)
St.push(pCurrent->pDown);
}
}
return IsTextEnded();
}
Формат записи выражения:
'='
: A+(B-C)*D-F/(G+H)=
Алгоритм:
'*' '/' (3), '+' '-' (2), '(' (1), '=' (0)
Пусть выражение имеет вид: A + (B - C) * D - F / (G + H)=