#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
//将中缀表达式转换为前缀表达式。
typedef struct Node
{
char key;
struct Node * left;
struct Node * right;
}Node;
//search for the operator with the highest grade in a
int search(char a[], int begin, int end)
{
int tag = -1;
int isInBrackets = 0;//是否在括号里面
if(a[begin] == '(' && a[end] == ')')
{
begin += 1;
end -= 1;
}
int amExist = 0;//是否存在。
for(int i = begin; i < end; i++)
{
if(a[i] == '(')
isInBrackets++;
if(a[i] == ')')
isInBrackets--;
if((a[i] == '+' || a[i] == '-') && isInBrackets == 0)
{
tag = i;
amExist = 1;
}
if((a[i] == '*' || a[i] == '/') && isInBrackets == 0 && amExist == 0)
{
tag = i;
}
}
return tag;
}
//build the binary tree
Node * buildBinaryTree(char a[], int begin, int end)
{
Node * p = NULL;
if(begin == end)
{
p = (Node *)malloc(sizeof(Node));
p->key = a[begin];
p->left = NULL;
p->right = NULL;
}
else
{
int tag;
tag = search(a,begin,end);
if (tag<0) {
printf("对不起,请输入正确的表达式。");
return NULL;//tag小于0的时候不是表达式。
}
p = (Node *)malloc(sizeof(Node));
p->key = a[tag];
if(a[begin] == '(' && a[end] == ')')
{
begin += 1;
end -= 1;
}
p->left = buildBinaryTree(a, begin, tag - 1);
p->right = buildBinaryTree(a, tag + 1, end);
}
return p;
}
void outputBinaryTree_pre(Node * head)
{
if(head)
{
printf("%c", head->key);
outputBinaryTree_pre(head->left);
outputBinaryTree_pre(head->right);
}
}
void outputBinaryTree_in(Node * head)
{
if(head)
{
outputBinaryTree_in(head->left);
printf("%c", head->key);
outputBinaryTree_in(head->right);
}
}
void outputBinaryTree_post(Node * head)
{
if(head)
{
outputBinaryTree_post(head->left);
outputBinaryTree_post(head->right);
printf("%c", head->key);
}
}
int main()
{
printf("please input a expression:");
char input[N];
while(scanf("%s", input))
{
if(strcmp(input, "exit") == 0)
{
break;
}
Node * head = NULL;
int length = (int)strlen(input);
head = buildBinaryTree(input, 0, length - 1);
printf("前缀输出为:\n");
outputBinaryTree_pre(head);//这个必须放在在里面,因为他是一个个输出的。
printf("\n中缀输出为:\n");
outputBinaryTree_in(head);//这个必须放在在里面,因为他是一个个输出的。
printf("\n后缀输出为:\n");
outputBinaryTree_post(head);//这个必须放在在里面,因为他是一个个输出的。
printf("\n");
}
return 0;
}
- 浏览: 1366257 次
- 性别:
- 来自: 开封
最新评论
-
用户6006038975:
macd2666 写道录制出来的语音声音好轻啊。你好,这个编译 ...
ios音频录制和播放,文件很小。压缩效果不错 -
用户6006038975:
macd2666 写道录制出来的语音声音好轻啊。
ios音频录制和播放,文件很小。压缩效果不错 -
用户6006038975:
linker command failed with exit ...
ios音频录制和播放,文件很小。压缩效果不错 -
mapboo:
http://www.codertopic.com/?page ...
史上最全的iOS面试题及答案 -
macd2666:
录制出来的语音声音好轻啊。
ios音频录制和播放,文件很小。压缩效果不错
相关推荐
选择输入前中后缀表达式,建立表达式二叉树,再前序中序后序遍历二叉树,输出三种形式的表达式
本话题主要涉及如何将中缀表达式转化为后缀表达式,以及如何构建表达式二叉树,并介绍三种二叉树遍历方法:前序遍历、中序遍历和后序遍历。 首先,中缀表达式是我们日常生活中常见的数学表达式形式,如2 + 3 * 4。...
本篇将详细讲解如何使用C++来处理中缀表达式,并通过构建二叉树以及转换为后缀表达式的方式来求解表达式的结果。 首先,我们要理解什么是中缀表达式。中缀表达式是我们在日常生活中最常使用的表达式形式,例如 "2 +...
前缀和后缀表达式是两种特殊的数学表达方式,它们在计算机科学中,尤其是在编译原理和算法设计中有着广泛的应用。这两种表达式都用于构建和解析表达式的运算顺序,而这里的任务是根据这些表达式生成对应的二叉树结构...
一个 表达式和一棵二叉树之间,存在着自然的对应关系。我需要写一个程序,实现基于二叉树表示的算术表达式的操作。 1.2这个算法的要求 假设算术表达式Expression内可以含有变量(a~z)、常量(0~9)和二元运算符(+,,*...
2. **前缀和后缀表达式转二叉树**:这两种表达式更容易转换为二叉树,因为它们天然地表示了操作符与操作数的关系。只需按照顺序依次读取字符,遇到数字就创建叶子节点,遇到操作符就创建内部节点。 四、二叉树的...
通过这个C++程序,我们可以将中缀表达式“2 + 3 * 4”转换为后缀表达式“2 3 4 * +”,并以这种方式有效地进行计算。这种方法在编译器和解释器的设计中具有广泛的应用,因为它提供了一种高效且易于理解的方式来解析...
根据逆波兰表达式将各序表达式显示出来,并且将二叉树输出
给定一个表达式,输出其中缀表达式,利用了栈和二叉树,是理解数据结构很好的资料
程序根据后缀表达式建立二叉树,建立过程中用到了栈,并分别采取递归和非递归的方法,对二叉树进行了先序、中序、后续遍历。
设计内容:设计一个程序,把中缀表达式转换成一棵二叉树,然后通过后序(根)遍历计算表达式的值。 设计要求: 对于输入的一个中缀表达式,判断表达式是否合法。(表达式的输入符合四则运算的显示规范) 如果合法,...
输入一表达式,将其用表达式树表示,并用表达式数计算表达式的值。
4. **遍历函数**:提供了先序、中序、后序三种遍历方式,不仅有助于理解表达式的结构,也有利于验证计算过程。 5. **主函数流程**:循环读取用户输入的表达式,构建表达式树并输出遍历结果,最后计算表达式的值并...
本项目以“C语言 二叉树的三种遍历”为主题,涵盖了前序遍历、中序遍历和后序遍历的基本概念、实现方法和实际应用。 1. 前序遍历(Preorder Traversal):前序遍历的顺序是根节点 -> 左子树 -> 右子树。在C语言中,...
在本主题中,我们将探讨如何使用二叉树来存储逆波兰表达式,并讨论前序、中序和后序遍历这三种二叉树遍历方法在处理这种表达式时的作用。首先,我们需要构建一个二叉树节点类,包含一个值(可能是操作数或运算符)和...
- 二叉树的遍历方式有三种:前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根)。 2. **二叉树的存储结构**: - 链式存储:每个节点包含一个数据域和两个指针域,分别指向左子节点和右子节点。 ...
output函数用于输出二叉树的后缀表达式,它使用后序遍历的方式将二叉树的节点输出到str数组中。value函数用于计算后缀表达式的值,它使用栈的方式将后缀表达式计算出来。 在本实验中,我们使用了二叉树来解决四则...
在处理算术表达式时,我们可以使用二叉树的特性来构建一种特殊的树型结构,称为表达式树(Expression Tree)。表达式树的每个内部节点代表一个运算符,而叶子节点则代表操作数。例如,对于算术表达式 "2 + 3 * 4",...