参考书籍:数据结构(C语言版) 严蔚敏 吴伟民编著 清华大学出版社
本文中的代码可从这里下载:https://github.com/qingyujean/data-structure
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 30
char 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.演示
int main(){
dealExpression();
return 0;
}
本文中的代码可从这里下载:https://github.com/qingyujean/data-structure