0
点赞
收藏
分享

微信扫一扫

[算法设计题] 计算后缀表达式

计算后缀表达式

题目

从键盘上输入一个后缀表达式,规定:后缀表达式长度不超过一行,以’$'结束操作数之间用空格分割。且操作符只有 + - * / 四种。
后缀表达式:234 34 + 2 *$

算法思想

  1. 后缀表达式已经存在符号优先级,不需要再次考虑运算符的优先级,从左往右扫描即可。
  2. 具体的实现步骤大致如下:
  3. 初始化一个储存数字及中间结果的栈(opnd)
  4. 从左往右扫描表达式 [操作数,运算符,$ ]
    4.1. 遇到操作数,进栈
    4.2. 遇到运算符,从栈里取出两个栈顶元素(取出栈最上面的两个数)。顺序:先出的放运算符的右边,后出来的放运算符的左边,按运算符运算,结果放入(opnd)栈里。
  5. 循环4直到遇到’$'结束,此时的栈里只有一位元素,就是表达式的值

有些数字是带有小数的,解决方法:

  1. 把读入的数字或者小数点(.)依次保存在一个字符串数组中。
  2. 利用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);//输出栈里的唯一元素(输出结果)
}

说明算法的主要代码,并在关键处添加上注释。无需具体实现。

举报

相关推荐

0 条评论