数据结构(6)--栈的应用之中缀表达式求值

来源:互联网 发布:阿里云 数据库 编辑:程序博客网 时间:2024/06/07 06:25

参考书籍:数据结构(C语言版) 严蔚敏 吴伟民编著 清华大学出版社

1.简要说明

分析:设操作符栈op栈    操作数栈num栈
op栈里不可能出现')',只可能有'+'、'-'、'*'、'/'、'(',设ch为当前字符,假设输入都是合法的
    1.ch为'+'、'-',则op栈顶为'('时ch入栈,否则进行运算直至op栈顶为'('
    2.ch为'*'、'/',则op栈顶为'('、'+'、'-'时ch入栈,否则op栈顶为'*'、'/',此时要进行运算
    3.ch为数字,入num栈
    4.ch为'(',则入op栈
    5.ch为')',则循环计算直至出现op栈顶为'(',并弹出栈顶元素'('
    5.ch为'#',则输入结束,此时应继续循环计算至op栈为空,那么弹出num栈栈顶元素即为运算结果

算法的流程图如下:


2.代码实现

//实例:(5*(12-3)+4)/2=24;4+2*3-10/5=8;#include<stdio.h>#define MAXSIZE 30char op[MAXSIZE], num[MAXSIZE];//全局变量int opTop, numTop;
void calculate(){char op1, op2;int opf;op2 = num[numTop-1];numTop--;op1 = num[numTop-1];numTop--;opf = op[opTop-1];opTop--;int tmpResult = 0;switch(opf){case '+':tmpResult = op1 + op2;break;case '-':tmpResult = op1 - op2;break;case '*':tmpResult = op1 * op2;break;case '/':tmpResult = op1 / op2;break;}num[numTop] = tmpResult;numTop++;}
//处理简单表达式void dealExpression(){//初始化两个栈opTop = 0, numTop = 0;printf("请输入简单表达式(以#号结束):");char currentChar;scanf("%c", ¤tChar);while(currentChar!='#'){switch(currentChar){case '+':case '-':while(opTop&&op[opTop-1]!='('){calculate();}op[opTop] = currentChar;opTop++;scanf("%c", ¤tChar);break;case '*':case '/':if(opTop&&(op[opTop-1]=='*'||op[opTop-1]=='/')){calculate();}op[opTop] = currentChar;opTop++;scanf("%c", ¤tChar);break;case '(':op[opTop] = currentChar;opTop++;scanf("%c", ¤tChar);break;case ')':while(op[opTop-1]!='('){//当前是'(',则op栈一定能有'('匹配到,即op栈一定不为空calculate();}opTop--;//出栈,弹出左括号scanf("%c", ¤tChar);break;default://currentChar为数字,则入num栈int opNum = 0;do{opNum = opNum*10 + currentChar-'0';scanf("%c", ¤tChar);}while(currentChar>='0'&¤tChar<='9');num[numTop] = opNum;numTop++;break;}//end switch}while(opTop){calculate();}int result = num[numTop-1];printf("计算结果是%d\n", result);}

3.演示

void main(){dealExpression();}




0 0
原创粉丝点击