算法 笔记]字符串表达式计算(简易版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:编写一个函数,计算字符串中表达式的值,参数中只包含计算符:+,-,*,/等。例如,str=”10+50+2*6/3”,result=64。
解析:
考虑算术表达式计算规则:
1.同优先级操作符之间,从左到右计算;
2.高优先级操作符的计算要早于低优先级操作符的计算;
3.加减操作符优先级低于乘除操作符优先级;
4.括号内的算术表达式的优先级高于括号外的乘除操作符的优先级。
调整后,操作符栈为:(op_stack,opr_top=1)
…+‟…*‟
当前,current_opr=‟*‟,top_opr=‟*‟,则priority(current_opr) == priority(top_opr),即符号第一种情况。
在编程中,对于“冒泡”处理有两种形式:
1. 首先将元素压入栈中,然后通过交换的形式来达到“冒泡”处理。
1for ( i = opr_top - 1; i > 0; --i )
2 {
3if ( priority(op_stack[i]) < priority(op_stack[i-1]) )
4 swap( op_stack, i, i - 1 );
5else
6break;
7 }
8
9for ( j = value_top - 1; j > i; --j )
10 {
11 swap( value_stack, j, j - 1 );
12 }
2. 不将数值压入栈中,而是首先查找符合要求的“位置”,然后将元素插入。
1for ( i = opr_top; i > 0; --i )
2 {
3if ( priority(op_stack[j-1]) > priority(current_opr) )
4 op_stack[j] = op_stack[j-1];
5else
6break;
7 }
8 op_stack[i] = current_opr;
9 ++opr_top;
10
11for ( j = value_top; j > i; --j )
12 {
13 value_stack[j] = value_stack[j - 1];
14 }
15 value_stack[j] = result;
16 ++value_top;
完整程序的源码:
ComputeExpression
简易版本不足之处:
1.不能计算括号表达式
2.对负数不能有效的处理
3.不能有效计算大数
4.对表达式中符号以及括号的合法性检查