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

参考书籍:数据结构(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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值