信管网cnitpm741729533***: [回复] 1、先将题干的算数(中缀)表达式转换为后缀表达式。具体方式是:从左往右,先把每个算数表达式都加上括号,再依次把运算符移动到本层次的括号后面,最后去掉全部括号。如:
10*(40-30/5)+20→((10*(40-(30/5)))+20)→((10(40(30 5)/)-)*20)+→10 40 30 5 / - * 20 +
2、初始化两个栈,操作数栈和运算符栈,从左往右扫描,若扫描到操作数,压入操作数栈,扫描到运算符或者界限符,压入运算符栈。具体方式:
① 从左往右扫描每一个元素,直到处理完所有元素。
② 若扫描到操作数,则压入栈,并回到①,否则执行③。
③ 若扫描到运算符,则弹出两个栈顶元素,执行相应的运算,运算结果压回栈顶,回到①。
根据后上面求得的缀表达式得知操作数入栈顺序为:[10,40,30,5]遇到运算符“/” 则将栈顶元素“5”出栈、“30”出栈执行除法,所得结果“6”压入栈中,此时操作数栈中的元素为[10,40,6]。继续扫描遇到运算符“-”,将操作数栈中的“40”和“6” 出栈,执行减法,所得结果“34”入栈。此时操作数栈中元素是[10,34]。继续扫描,遇到运算符“*” ,将“34”和“10”出栈,执行乘法,所得结果“340”压入操作数栈。此时操作数栈中元素[340]。继续扫描,遇到“20”进行入栈,此时操作数栈中元素是[340,20]。继续扫描,遇到运算符“+”,将“20”与“340”出栈,执行加法,所得结果360入栈。最终操作数栈中的元素是[360]。至此后缀表达式全部处理完毕。由此可知,所需操作数栈的大小至少为4,即能存放“10,40,30,5”这几个操作数才能满足计算要求。
信管网cnitpm687588838***: [回复] 依次输入10 40 30 5 / - *,保存运算结果后输入 20+
所以最少要求为4
|