Помогите решить задачу на стек (очередь) - Pascal

Узнай цену своей работы

Формулировка задачи:

Вы попали в древнюю страну "СТЕКОВИЮ", где практически все организовано по принципу стека. Перед Вами правитель страны поставил следующую задачу: составить программу для робота-казначея по приведению в порядок сокровищницы государства. Сокровищница имеет следующий вид: это два длинных тупиковых коридора, в которых в беспорядке составлены золото, бриллианты, серебро, другие драгоценности, равные друг другу по стоимости, а также имеется 2 свободных тупиковых коридора того же размера, что и заполненные. Ваша программа должна рассортировать драгоценности, разместив их при этом по различным коридорам. Или обьясните как это можно сделать::confused:

Решение задачи: «Помогите решить задачу на стек (очередь)»

textual
Листинг программы
{з-золото
с-серебро
б-брилианты
д-другие драгоценности}
program Boris;
uses StkElCh,crt;
var St1,St2,St3,St4:StackC;
{-----------------------------------------------------------------------}
  procedure Zapolnenie;
    var c:char;
        CountSt1,CountSt2,i:integer;
    begin
    write('Количество элементов в первом коридоре= ');readln(CountSt1);
    for i:=1 to CountSt1 do
      begin
      readln(c);
      St1.AddBegining(c);
      end;
    write('Количество элементов во втором коридоре=');readln(CountSt2);
    for i:=1 to CountSt2 do
      begin
      readln(c);
      St2.AddBegining(c);
      end;
    end;
{-----------------------------------------------------------------------}
  procedure MetalsInSt3_StonesInSt4;
    var c:char;
    begin
    while St1.IsNotEmpty do
      begin
      c:=St1.OutBegining;
      if (c='з') or (c='с') then
                            St3.AddBegining(c);
      if (c='б') or (c='д') then
                            St4.AddBegining(c);
      end;
    while St2.IsNotEmpty do
      begin
      c:=St2.OutBegining;
      if (c='з') or (c='с') then
                            St3.AddBegining(c);
      if (c='б') or (c='д') then
                            St4.AddBegining(c);
      end;
    end;
{-----------------------------------------------------------------------}
  procedure ZolotoInSt1_SerebroInSt2;
    var c:char;
    begin
    while St3.IsNotEmpty do
      begin
      c:=St3.OutBegining;
      if c='з' then
                St1.AddBegining(c);
      if c='с' then
                St2.AddBegining(c);
      end;
    end;
{-----------------------------------------------------------------------}
  procedure BrilliantInSt3_DrugoeInSt2;
    var c:char;
    begin
    while St4.IsNotEmpty do
      begin
      c:=St4.OutBegining;
      if c='б' then
                St3.AddBegining(c);
      if c='д' then
                St2.AddBegining(c);
      end;
    end;
{-----------------------------------------------------------------------}
  procedure DrugoeInSt4;
    var c:char;
    begin
    if St2.IsEmpty then
                     exit;
    c:=St2.Begining;
    if c<>'д' then
               exit;
    c:=St2.OutBegining;
    while (c='д') and (St2.IsNotEmpty) do
      begin
      St4.AddBegining(c);
      c:=St2.OutBegining;
      end;
    if c='с' then St4.AddBegining(c)
             else St2.AddBegining(c);
    end;
{-----------------------------------------------------------------------}
begin
St1.BeginWork;
St2.BeginWork;

St3.BeginWork;
St4.BeginWork;
Zapolnenie;
MetalsInSt3_StonesInSt4;
ZolotoInSt1_SerebroInSt2;
BrilliantInSt3_DrugoeInSt2;
DrugoeInSt4;
write('Первый коридор    ');St1.Show;writeln;
write('Второй коридор     ');St2.Show;writeln;
write('Трейтий коридор    ');St3.Show;writeln;
write('Четвертый коридо  ');St4.Show;writeln;
St1.Finishing;
St2.Finishing;
St3.Finishing;
St4.Finishing;
readkey;
end.

Оцени полезность:

12   голосов , оценка 4.167 из 5