Ifstream in("input.Txt");
while (in.peek()!=EOF)
{
in>>i;
switch (i)
{
case '(': t.push(i); break;// если считанный символ (, то записываем его
//в стек
case ')': // если считанный символ ), то в стеке
//должна находиться соответствующая ему (
if (!t.empty()) // если стек не пуст, то выбираем из него одну
t.pop(); // открывающуюся скобку, иначе возвращаем
else return -1; // код –1 – лишняя закрывающая скобка
}
}
In.Close();
/* Если после того, как весь текст обработан, стек пустой, то баланс скобок в тексте соблюден – возвращаем код 0. В противном случае, в стеке находятся открывающиеся скобки, которым не соответствуют закрывающиеся – возвращаем код 1. */
if (t.empty()) return 0; else return 1;
}
Int main()
{
ofstream out("output.txt");
int i=balans(); // вызываемфункцию balans
// обрабатываемзначение, возвращенноефункцией balans
if (!i) out<<"ok"; else if (i==1) out<<"error: (";
else out<<"error: )";
out.close();
return 0;
}
_____input1.txt__________________ ______ input2.txt____________________
(5-x*(4/x-(x+3)/(y-2)-y)-9 (5-x)*(4/x-(x+3)/(y-2)-y)-9
_____output1.txt_________________ ______ output2.txt___________________
error: ( ok
_____input3.txt__________________ ______ input4.txt____________________
(5-x)*(4/x-(x+3)/(y-2)-y))-9 7+9-x/2+4-b*3
_____output3.txt_________________ ______ output4.txt___________________
error: ) ok
Решение практических задач с использованием очереди
1. Даны файлы data1.txt и data2.txt, компонентами которых являются натуральные числа. Переписать содержимое файла data1.txt в файл data2.txt и наоборот без использования вспомогательного файла.
Поскольку по условию вспомогательный файл использовать нельзя, будем использовать вспомогательную очередь. Тогда сначала перепишем содержимое первого файла в очередь, потом – содержимое второго файла в первый, и наконец, содержимое очереди во второй файл.
Замечание. Во всех задачах этого раздела будем использовать класс tQueue, описание класса tQueue в примерах повторять не будем.
#include "exception"
#include "iostream"
#include "fstream"
#include "string"
using namespace std;
class queueException: public exception
{
public:
queueException(const string & message="")
: exception(message.c_str())
{}
};
template <class Item>
class tQueue
{
struct elem
{Item inf; // информационное поле целого типа
elem *next;
elem (Item x):inf(x),next(0)
{}
};
public:
elem *head,*tail;
tQueue():head(0),tail(0){}
bool empty()
{return head==0;}
Item get()
{
if (empty())
throw queueException("StackException: get — queue empty");
else
{
elem *r=head;
Item i=r->inf;
head=r->next;
delete r;
return i;
}
}
void put(Item data)
{elem *t=tail;
tail=new elem(data);
if (!head) head=tail;
else t->next=tail;
}
};