异常的情况很多,但是正常情况这个是对滴。。。
用栈实现转化:
如果新读入的汉字(假设它代表的数字为N)比栈顶数字还要大
{
弹出栈中所有比N小的元素,并将这些元素累加,假设结果为S;
将S*N入栈;
}
否则
{
将N直接入栈;
}
最后将栈中所有数字相加。
Exp:一亿一千二百五十八万三千二百四十(112,583,240)
第1步==>处理“一”,N=1
直接入栈,
此时栈中元素为:1 (右侧是栈顶)
第2步==>处理“亿”,N=100000000
弹出栈中唯一的元素,然后S=1,将S*N=100000000入栈
此时栈中元素为:100000000
第3步==>处理“一”,N=1
直接入栈
栈中元素为:100000000,1
第4步==>处理“千”,N=1000
弹出栈中比N小的元素(只有一个),然后S=1,将S*N=1000入栈
此时栈中元素为:100000000,1000
第5步==>处理“二”,N=2
直接入栈
此时栈中元素为:100000000,1000,2
第6步==>处理“百”,N=100
弹出栈中比N小的元素(只有一个),然后S=2,将S*N=200入栈
此时栈中元素为:100000000,1000,200
第7步==>处理“五”,N=5
直接入栈
此时栈中元素为:100000000,1000,200,5
第8步==>处理“十”,N=10
弹出栈中比N小的元素(只有一个),然后S=5,将S*N=50入栈
此时栈中元素为:100000000,1000,200,50
第9步==>处理“八”,N=8
直接入栈
此时栈中元素为:100000000,1000,200,50,8
第10步==>处理“万”,N=10000
弹出栈中比N小的元素(有四个),然后S=1258,将S*N=12580000入栈
此时栈中元素为:100000000,12580000
转自:
http://blog.csdn.net/zyr1984/article/details/5803786
后记:
这个题目和算术表达式求值(https://blog.csdn.net/taoqick/article/details/20722811)很像,就是把它parse成一个二叉树,父节点对应运算符,两个子节点对应两个数。如果无法保证输入是合法的,需要注意以下几点:
1. 中缀表达式的顺序是(数字,运算符,数字,运算符,数字,运算符,数字...),可以用这个节奏来判断是否是有效:
a. 对于算术表达式,需要注意-8要在FetchNum的时候拿到
b. 对于中文,需要注意“十”既是运算符也是数字
2. 对于中文,还有一些更特殊的情况:
a. 输入"零",意味着数字栈的相邻间隔要超过10倍,否则输入无效
b. 三十三千,进入栈的时候要判断是否大于千,这种是无效的。例如三十三千、六十六百
c. 只有亿是可以嵌套的,例如四亿亿