主要是掌握住压栈算法,在校期间教辅提过这个设计案例:
设算数 “i0”,“i1”,“i2”,……
设算符 优先级0 “+”,“-”, 优先级1 “*”,“/”, 优先级2 “(”,“)”
设算式 i = i0 + i1 - i2 * i3 / (i4 * i5)……
Class Sign{
public int Priority{get;private set}//优先级
public int NumberCount{get;private set}//表示几元运算
public string Value{get;private set}//表现值
}
int Calculate(string i){
int index;
Stack<int> numbers = new Stack<int>();
Stack<Sign> signs = new Stack<Sign>();
int n;
Sign s;
while(index < i.length){
n = GetNumber(i, ref index);
if(n >= 0){//匹配成功
numbers.push(n);
}
else{
s = GetSign(i, ref index);
if(s == null){//非法字符?
........//可以 Throw Exception 或 做忽略等处理
}
if(s.Priority > signs.Current.Priority){//压栈
signs.push(s);
}
else{//计算 signs.Current
int[] ns = new int[signs.Current.NumberCount];
for(int j = 0;j < ns.length;j ++){
ns[j] = numbers.pop();
}
numbers.push(Calculate(signs.Current, ns));//计算并保存子式
signs.push(s);
}
}
}
//计算余式
while(signs.Count > 0){
int[] ns = new int[signs.Current.NumberCount];
for(int j = 0;j < ns.length;j ++){
ns[j] = numbers.pop();
}
numbers.push(Calculate(signs.Current, ns));//计算并保存子式
signs.pop();
}
}
int GetNumber(string i, ref int charIndex){//读取算数
//如果能运用正则表达式一次性清理出所有 算数、算符 则最好:),那本方法就可以省去了
}
Sign GetSign(string i, ref int charIndex){//读取算符
//如果能运用正则表达式一次性清理出所有 算数、算符 则最好:),那本方法就可以省去了
}
int Calculate(Sign sign, int[] numbers){//计算该算式
switch(sign.Value){
case("+"):
//处理加法逻辑
break;
Default:
//Throw Exception 或 返回默认运算等
break;
}
}
大概的算法脉络或许是这样,其中有很多细节需要自行把握了(异常处理等)。
从几何时,我也能徒手编程了:),偶尔练练算法感觉挺舒畅的。
--------------------------------------------------------------------------
貌似“负数”没考虑进去!
这个代码应该很多。
当初我也作过。思路:
采用Winform吧。关键的问题是
1)界面
2)计算用户输入数据
3)显示。
这里一个加法操作为例(其他操作类似)开发步骤:
1)vs2005/8新建一个Winform 项目
2)在界面上拖放几个控件:3个文本框textbox.一个按钮(也可以单独为加减乘除个设置一个按钮);
3)选择一个按钮button,双击。后台产生事件对应的方法button1_ObjectClick(object sender, eventarg e)
4)在这里button1_ObjectClick添加代码。获取你控件的值,加数1和加数2.double dNum1 = double.parse(textbox1.text);//转换输入类型为数值型
double dNum2 = double.parse(textbox2.text);//转换输入类型为数值型
double dSum = dNum1 + dNum2 ;//计算结果;
textBox3.text = dSum.toString();//转换类型。显示结果。
5)记得类型转换前,判断一下用户的输入是否为空。
6)除法操作,除数不能为空。
希望对你有参考价值~