Цитата:
Сообщение от Дария
ПОЖАЛУЙСТА!!!Помогите написать программу на С. очень нужно для экзамена. заранее благодарю.
Дерево выражения вывести (используя обход дерева) в инфиксной (обычной) форме записи, учитывать приоритет операции. выражение (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";.