一、实验目的
1.掌握栈的存储表示和实现
2.掌握栈的基本操作实现。
3.掌握栈在解决实际问题中的应用。
二、实验要求
问题描述:设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。
(1)输入的形式:表达式,例如2*(3+4)#
包含的运算符只能有’+’ 、’-’ 、’’ 、’/’ 、’(’、 ‘)’,“#”代表输入结束符;
(2)输出的形式:运算结果,例如2(3+4)=14;
(3)程序所能达到的功能:对表达式求值并输出。
三、解题参考思路
为了实现用栈计算算数表达式的值,需设置两个工作栈:用于存储运算符的栈opter,以及用于存储操作数及中间结果的栈opnd。
算法基本思想如下:
(1)首先将操作数栈opnd设为空栈,而将’#‘作为运算符栈opter的栈底元素,这样的目的是判断表达式是否求值完毕。
(2)依次读入表达式的每个字,表达式须以’#‘结,读入字符若是操作数则入栈opnd,读入字符若是运算符,则将此运算符c与opter的栈顶元素top比较优先级后执行相应的操作,具体操作如下:
(i)若top的优先级小于c,即top<c,则将c直接入栈opter,并读入下一字符赋值给c;
(ii)若top的优先级等于c,即top=c,则弹出opter的栈顶元素,并读入下一字符赋值给c,这一步目的是进行括号操作;
(iii)若top优先级高于c,即top>c,则表明可以计算,此时弹出opnd的栈顶两个元素,并且弹出opter栈顶的的运算符,计算后将结果放入栈opnd中。直至opter的栈顶元素和当前读入的字符均为’#’,此时求值结束。
算符间的优先关系如下表所示(表来源:严蔚敏《数据结构》):
表中需要注意的是θ1为opter的栈顶元素,θ2为从表达式中读取的操作符,此优先级表可以用二维数组实现。
1.int getIndex(char theta) //获取theta所对应的索引
2.{
3. int index = 0;
4. switch (theta)
5. {
6. case '+':
7. index = 0;
8. break;
9. case '-':
10. index = 1;
11. break;
12. case '*':
13. index = 2;
14. break;
15. case '/':
16. index = 3;
17. break;
18. case '(':
19. index = 4;
20. break;
21. case ')':
22. index = 5;
23. break;
24. case '#':
25. index = 6;
26. default:break;
27. }
28. return index;
29.}
30.
31.char getPriority(char theta1, char theta2) //获取theta1与theta2之间的优先级
32.{
33. const char priority[][7] = //算符间的优先级关系
34. {
35. {
'>','>','<','<','<','>','>' },
36. {
'>','>','<','<','<','>','>' },
37. {
'>','>','>','>','<','>','>' },
38. {
'>','>','>','>','<','>','>' },