昨天帮“妮无可代替”MM解决了点computer problems,突然发现很久没有写部落格了。于是还答应为她写一篇介绍超级兔子的文章(这个还是放在这个周末吧,^-^)。Samson注:结果到现在还没完成这篇文章,=_=||
今天做了数据结构的第一节实验课,要求是将中缀式转为后缀式(输入的是类似于a+b-c/d的格式),然后自己输入各个字幕对应的值,最后求解。我发现这个太麻烦了。我是个很懒的人,就连打开个程序我也希望一个按键到位(所以写了个MoreEffectiveKey,让Alt+1~9都可以打开对应的程序)。
今天讲的是如果让输入的数字中缀式自动替换为字母中缀式并自动创建字母映射,然后将字母中缀式转换成字母后缀式最后计算值。
程序使用VS2005,纯C++编写,非C++.NET。
共三个文件,Main.cpp(主函数文件),CalConvert.h(方法声明),CalConvert.cpp(方法实现)
1
//中缀式到后缀式的转换头文件
2
#pragma once
3
#include <string>
4
using std::string;
5
6
//中缀式转后缀式,返回后缀式
7
string MidToPos(string mid_e);
8
9
//将前缀式中的数字替换成字母,返回字母对应的数字,a为数组中的第一个,b是第二个
10
string ReplaceTextToChar(string p_textMid,double* p_cnMap,int* cnMap_nLen);
11
12
//将映射表内容输出
13
void displayMap(double* p_dmap,int map_nLen);
14
15
//pos为后缀式,如果计算无错则将结果返回给p_dResult
16
bool CalculateTheValue(string Pos_e,double* p_dResult,double* p_dMap);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
这是CalConvert.h。接下来是CalConvert.cpp
最后是Main.cpp,也就是测试用的主函数。
1
//Main.cpp
2
#include <iostream>
3
#include <string>
4
#include "CalConvert.h"
5
6
using std::cin;
7
using std::cout;
8
using std::endl;
9
using std::string;
10
11
12
int main()
13
}
2
3
4
5
6
7
8
9
10
11
12
13
补充修改:
如果include <math.h>,那么可以实现更复杂的乘方运算,当前的程序只支持整数乘方,如果用微软的库,那么可以小数,负数和整数都行。只要修改乘方运算的那部分代码为:
y=stack[top];
stack[top]=pow(y,x);
如果产生异常,会由库函数抛出,自己就不用操心了~
这写方法可以改造到MFC,C#,和纯C语言。这里需要注意为了效率C#中最好使用StringBuilder来处理经常改变的string值。如果是要改造到C语言,我也有一份源代码(老师作业要求用C语言写),需要提醒大家的是C语言米有stirng类型,也不能返回一个char数组,所以大家就顶一个超级大的char[]数字来代替string吧。