表达式求值

来源:百度知道 编辑:UC知道 时间:2024/05/14 07:43:07
中缀表达式转换为后缀表达式,并求值,(C语言)
谢谢了!急求

从算法来说,要考虑中缀的运算符优先级,括号等,可以使用简单语法制导翻译,去看编译原理书吧,从数据结构来说,可以使用二元树和栈。使用二元树就是先建立表达式的树,然后后根遍历即可。难点在建立树。
使用栈的算法也很多,说个好想的。假设表达式的字符来自输入流in,建立栈A存放运算符,B存放结果,从in读入一个操作数压进B,读入一个运算符压进A,如此反复。
1.读入一个元素e
2.如果e是操作数或者(,压入B,跳转到1
3.如果e是运算符(不包含括号),跳转到3.1
4.如果e是),跳转到4.1
5.如果e是EOF,即输入流结束,反复弹出A栈顶压入B,直到A为空,算法结束,B从栈底到栈顶的符号即为后缀表达式(需要把B翻个个儿^_^)

3.1.判断A的栈定符号t,如果t不为(,且优先级大于等于e,则弹出t压入B,跳转到4,如果t为空,即栈中为空,或其他情况直接把e压入A,跳转到1
4.1.弹出A的栈顶压入到B,如此反复直到弹出的符号为(,(和)不要压入B,跳转到1

这是我临时想的,可能还有bug,或描述不清的地方,如果上网搜的话应该有很多源代码的,如果学过编译原理的话还可以有更好的算法,这个算法没考虑容错性。

建议看《数据结构》中关于栈的实现部分即可解决。

#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAXNUM 100
typedef int DataType;
struct SeqStack
{
DataType s[MAXNUM];
int t;
};
typedef struct SeqStack *PSeqStack;
PSeqStack createEmptyStack_seq()
{
PSeqStack pastack;
pastack=(PSeqStack)malloc(sizeof(struc