Показать сообщение отдельно
Старый 21.05.2009, 12:55   #6 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Цитата:
Сообщение от Дария Посмотреть сообщение
ПОЖАЛУЙСТА!!!Помогите написать программу на С. очень нужно для экзамена. заранее благодарю.
Дерево выражения вывести (используя обход дерева) в инфиксной (обычной) форме записи, учитывать приоритет операции. выражение (2+3)*4.
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct element
{
	int number;
	char operation;
	struct element *left;
	struct element *right;
};

int findLastOperation(char str[], int count)
{
int current = 0, pri, i;
int number;
int minimal = -1;

	for(i = 0; i < count; i++)
	{
		switch(str[i])
		{
			case '(':
				current += 2;
				break;
			case ')':
				current -= 2;
				break;
			case '*':
			case '/':
				pri = current + 1;
				if(((minimal >= 0) && (pri < minimal)) || (minimal < 0))
				{
					number = i;
					minimal = pri;
				}
				break;
			case '+':
			case '-':
				pri = current;
				if(pri == 0)
					return i;
				if(((minimal >= 0) && (pri < minimal)) || (minimal < 0))
				{
					number = i;
					minimal = pri;
				}
				break;
			default:
				break;
		}
	}
	if(minimal >= 0)
		return number;
	else
		return -1;
}

int stringtoi(char str[], int count)
{
char tmp[count + 1];
	if(str[0] == '(')
		str++, count--;
	if(str[count - 1] == ')')
		count--;

	strncpy(tmp, str, count);
	tmp[count] = '\0';

	return atoi(tmp);
}

struct element *build(char str[], int count)
{
struct element *el = (struct element *)malloc(sizeof(struct element));
int n = findLastOperation(str, count);

	if(n == -1)
	{
		el->operation = 0;
		el->number = stringtoi(str, count);
	} else
	{
		el->operation = str[n];
		el->left = build(str, n);
		el->right = build(str + n + 1, count - n - 1);
	}
	return el;
}

void printTree(struct element *el, int n)
{
int i;
	for(i = 0; i < n; i++)
		putchar(' ');
	putchar('|');
		
	if(el->operation == 0)
	{
		
		printf("%d\n", el->number);
	} else
	{
		
		printf("%c\n", el->operation);
		printTree(el->left, n + 1);
		printTree(el->right, n + 1);
	}
}

int main()
{
char str[] = "(2+3)*4";
struct element *tree = build(str, strlen(str));

	printTree(tree, 0);

	return 0;
}
Выражение задаётся в main строкой char str[] = "(2+3)*4";.
csbwalker вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070