计算后缀表达式
题目
从键盘上输入一个后缀表达式,规定:后缀表达式长度不超过一行,以’$'结束操作数之间用空格分割。且操作符只有 + - * / 四种。
后缀表达式:234 34 + 2 *$
算法思想
- 后缀表达式已经存在符号优先级,不需要再次考虑运算符的优先级,从左往右扫描即可。
- 具体的实现步骤大致如下:
- 初始化一个储存数字及中间结果的栈(opnd)
- 从左往右扫描表达式
[操作数,运算符,$ ]
4.1. 遇到操作数,进栈
4.2. 遇到运算符,从栈里取出两个栈顶元素(取出栈最上面的两个数)。顺序:先出的放运算符的右边,后出来的放运算符的左边,按运算符运算,结果放入(opnd)栈里。 - 循环4直到遇到’$'结束,此时的栈里只有一位元素,就是表达式的值
有些数字是带有小数的,解决方法:
- 把读入的数字或者小数点(.)依次保存在一个字符串数组中。
- 利用
atof(ArrayName)
将字符串数组转换为一个浮点数
算法描述[算法设计题]
double Postfix() {
InitStack(opnd);//初始化一个栈
double num = 0.0;//操作数初始化
ch = getchar();//获取表达式的第一个字符
while (ch != '$') {//循环扫描表达式
i = 0; //
while ((ch >= '0' && ch <= '9') || ch == '.' ) {
data[i] = ch;
i++;
ch = getchar();
}
num = atof(data);//把字符数组的数字转换为浮点数
Push(opnd, num); //入栈
switch (ch) {
case '+':
Pop(opnd, b);
Pop(opnd, a);
Posh(opnd,a+b);
break;
case '-':
Pop(opnd, b);
Pop(opnd, a);
Posh(opnd,a-b);
break;
case '*':
Pop(opnd, b);
Pop(opnd, a);
Posh(opnd,a*b);
break;
case '/':
Pop(opnd, b);
Pop(opnd, a);
Posh(opnd,a/b);
break;
}
ch = getchar();//读表达式的下一个元素
}
return getTop(opnd);//输出栈里的唯一元素(输出结果)
}
说明算法的主要代码,并在关键处添加上注释。无需具体实现。