Страница 1 из 1

Вычисление логических выражений при помощи бинарного дерева

Добавлено: 24 авг 2009, 11:50
koly4ii
Ребят помогите кто-нибудь, горю!
Необходимо написать программу вычисляющую логические выражения с помощью бинарных деревьев.
Т.е. например пусть | - дизьюнкция, & - коньюнкция, -> - импликация; надо чтобы после ввода такой формулы, например, (0 & 1 | 1) -> 0 выдавал ответ (в данном случае единицу).
Мне хотябы былоб от чего оттолкнуться, если кто-нибудь может хотябы для одной функции написать - напишите пожалуйста...

Re: Вычисление логических выражений при помощи бинарного дерева

Добавлено: 25 авг 2009, 22:00
Грымзик
Если не обязательно именно строить дерево как структуру, то вот прога.
В ней строка справа-налево просматривается, пока правая часть не образует
правильное скобочное выражение. Далее функция рекурсивно вызывается
от получившихся правой и левой частей. Может неправильно написано
вычислении импликации (0 только если 0->1 ?)

Код: Выделить всё

#include <iostream>
#include <string>
using namespace std;

string delete_spaces(string str)
{
	string s="";
	for (int i=0; i<str.size(); ++i)
	{
		if (str[i]!=' ' && str[i]!='\t')
			s+=str[i];
	}
	return s;
}

bool check(string str)
{
	string s=delete_spaces(str);

	if (s.size()==1 && s=="0")
		return 0;
	if (s.size()==1 && s=="1")
		return 1;
	int q=0;

	string s1, s2;
	

	for (int i=s.size()-1; i>=0; --i)
	{

		if (i==0 && s[i]=='(' && q==1)
		{
			s.assign(s, 1, s.size()-2);
			i=s.size()-1;
			q=0;
		}


		if (s[i]==')')
			q+=1;
		if (s[i]=='(')
			q-=1;

		if (q==0 && s[i]=='|')
		{
				s1.assign(s, 0, i);
				s2.assign(s, i+1, s.size()-i-1);
				return check(s1)||check(s2);
		}
		if (q==0 && s[i]=='&')
		{
				s1.assign(s, 0, i);
				s2.assign(s, i+1, s.size()-i-1);
				return check(s1)&&check(s2);
		}
		if (q==0 && s[i]=='>')
		{
				s1.assign(s, 0, i-1);
				s2.assign(s, i+1, s.size()-i-1);
				if (!check(s1) && check(s2))
					return 0;
				else return 1;
		}
	}
}


int main()
{

	string s;
	getline(cin,s);
	cout<<check(s);
	return 0;
}

Re: Вычисление логических выражений при помощи бинарного дерева

Добавлено: 26 авг 2009, 10:26
koly4ii
Если не обязательно именно строить дерево как структуру...
Я если честно сам не совсем уверен, ибо столкнулся с множеством проблем пытаясь решить эту задачу выстраивая дерево структурой, которые так и не решил. Спасибо за предложенный вариант, я что-то даже не подумал о такой возможности. Теперь будет решена хоть каким-то способом =))
Может неправильно написано
вычислении импликации (0 только если 0->1 ?)
Это уже не столь важно, важен сам алгоритм. А так 0 только когда 1->0 =)
Ещё раз спасибо за предложенный вариант!