表达式求值的另一种方法是什么,表达式求值的另一种方法叫做
表达式的求值可以通过语法实现,中缀表达式可以通过堆栈直接转换成后缀表达式。那么就很容易找到表达式的值。
粘贴下面的程序源代码:(可能有点长,呵呵:)
主页面
# include“stack . CPP”
#includestack.h
#包括iostream
使用命名空间std
*该功能有两个功能。
* 1.输入中缀表达式。
* 2.将中缀表达式转换为后缀表达式
*形参是两个指针指向两个数组(一个存储数字,一个存储运算符)。
*返回值是数字和运算符的总数(如果转换错误,返回-1)
int change(double *Darra,char *Carra)
int num=0;//记录公式中数字和运算符的总数
char ch//临时存储,输入字符
双斗;//暂存,输入号码
Stack char mychar//存储运算符
bool wchar=false//有没有非法字符?
Cout 请输入一个表达式(为方便起见可以带一个空格),并以=结尾: n endl
while( cin ch,=!=ch)
开关(通道)
大小写“0”:大小写“5”:
案例“1”:案例“6”:
案例“2”:案例“7”:
案例“3”:案例“8”:
案例“4”:案例“9”:
num
CIN . put back(ch);//如果是数字,就扔回去,用double数据打包。
斗;
cout dou结尾;//后缀表达式的部分输出
darra[num]=dou;
打破;
案例“”:
大小写-:
大小写 * :
案例“/”:
而((!我的char。Isempty()) //堆栈不为空
(mychar。Top()!=()//堆栈元素的顶部不是空括号
((mychar。Top()==*) (mychar。Top()==/) (ch== ) (ch==-))
//栈顶运算符的优先级不低于输入的运算符。
//如果满足以上三个条件,堆栈中的所有元素都会弹出。
num
cout mychar。Top()结束;//后缀表达式的部分输出
Carra[num]=mychar。top();
我的char。pop();
我的char。推(ch);//如果没有,将访问操作符压入堆栈。
打破;
案例(:
*试图解决省略号*的操作不成功。
if( ==Carra[num] num!=0)
num
cout“*”结束;
卡拉[数字]= * ;
我的char。推(();//遇到推入堆栈的左括号
打破;
案例“)”:
如果(mychar。Isempty()) //确定括号是否匹配。
Cou n 有多余的) .endl
return-1;
而(!我的char。Isempty()) //遇到右括号,弹出堆栈中的元素。
If((==mychar。Top()) //直到遇到左括号
我的char。pop();
打破;
Else //如果堆栈为空,仍然没有左括号,执行弹出操作时会出现错误,系统将退出。
num
cout mychar。Top()结束;//后缀表达式的部分输出
Carra[num]=mychar。top();
我的char。pop();
打破;
案例“”:
打破;
默认值://检测非法字符
wchar=true
而(!我的char。Isempty()) //输出堆栈中剩余的运算符。
If((==mychar。Top()) //括号不匹配。
“cou” n n有多余的“(“.”endl
return-1;
num
cout mychar。Top()结束;//后缀表达式的部分输出
Carra[num]=mychar。top();
我的char。pop();
If(0==num) //没有表达式输入
Cou n 您尚未输入任何表达式.endl
return-1;
if(wchar)
Cout (字符串中有非法字符);
Couendl 以上是中缀表达式和相应的后缀表达式,;
退货数量;
*运算函数,取出数组中存储的符号和数字(后缀表达式),计算结果并返回。
*参数:存储后缀表达式的两个数组头的地址(如果这里用了stack,那么后缀表达式从stack输出时顺序是完全颠倒的),后缀表达式的长度。
*返回值:后缀表达式的求值结果。
double Compute(char *Carra,double *Darra,int num)
int I=1;//取后缀表达式的辅助变量
双d1,D2;//暂存区中弹出的两个变量
堆栈双分辨率;//存储数字的操作堆栈
while( i=num)
If(Carra[i]== ) //如果I是无效运算符,则表示在后缀表达式中,I应该对应一个数字。
RES . Push(Darra[I]);//数字堆叠
Else //如果是运算符
D1=Res . Top();
RES . Pop();
D2=Res . Top();
RES . Pop();//从栈顶弹出两条数据进行计算
开关(卡拉[i])
案例“”:
RES . Push(D1 D2);//计算后按回堆栈
打破;
大小写-:
RES . Push(D2-D1);
打破;
大小写 * :
RES . Push(D1 * D2);
打破;
案例“/”:
if(0==d1)
cout 请注意分母不能为零.恩德尔
系统("暂停");
退出(0);
推动决议(D2/D1);
打破;
默认值:
cout (计算)运算符匹配出错了.恩德尔
退出(0);
我;
return Res . Top();//弹出栈中最后一个数字(计算结果)
char Carra[S _ size];//装入运算符
for(I=0;i S _ sizei ) //将储存运算符的数组做一个标记,以明确该下标所对应的是数字还是运算符
carra[I]= 0 ;//若检测到卡拉[i]= ,则说明卡拉[我]中没有存入运算符,而达拉[我]中存储了一个数字
cout * * * * * * * * * * * * * * * * * * * * * * * * * 一个简单表达式计算程序* * * * * * * * * * * * * * * * * * * * * " endl
总部所在地的cout ——by
cout 注意:请写全表达式,不要省略*,写负数时请写成 0 - x 的形式 n endl
if( ( i=change(Darra,Carra) )==-1 ) //判断转换是否成功
cout n转换失败.恩德尔
系统("暂停");
退出(0);
其他
cout 其计算结果为: n endl
cout Compute(Carra,Darra,I)endl;//计算并输出结果
系统("暂停");
返回0;
}
stack.cpp
模板类T
bool Stack T :Isempty() //如果堆栈为空,则返回真实的否则返回错误.
if(-1==top)
返回真实的
其他
返回错误的
模板类T
void Stack T :Pop() //从堆栈顶部弹出元素
if(top==-1)
cout 弹出栈出错.恩德尔
退出(0);
top-;
模板类T
空堆栈T :Push(T ele) //将此元素推入堆栈。
如果(顶部S_size)
cout 栈溢出.恩德尔
退出(0);
顶;
elem[top]=ele;
模板类T
T Stack T :Top() //返回栈顶元素。
if(-1==top)
cout 已至栈底.恩德尔
//exit(0);
return elem[top];
模板类T
int Stack T:Size()//返回堆栈中元素的个数。
返回顶部;
模板类T //清除堆栈中的所有元素
void Stack T :clear()
top=-1;
#endif
stack.h
void Pop();//从堆栈顶部弹出一个元素
空推(T elem);//将此元素推入堆栈。
t Top();//返回堆栈的顶部元素。
bool Isempty();//如果堆栈为空,则返回真实的否则返回错误.
int Size();//返回堆栈中元素的数量。
void clear();//清除堆栈中的所有元素
私人:
t elem[S _ size];
栈顶
#endif
运行结果: