描述
从键盘上输入一个后缀表达式,试编写算法计算表达式的值。规定:后缀表达式的长度不超过一行,以“=”作为输入结束,操作数之间用空格分隔,操作符只可能有+、−、*、/四种运算。
输入
多组数据,每组数据一行,对应一个后缀算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。
输出
对于每组数据输出一行,为表达式的运算结果。
输入样例 1
1 2+8 2-7 4-/*=
1 2+=
1 2/=
=
输出样例 1
6.00
3.00
0.50
#include <iostream>
#include <stdlib.h>
#include <cstring>
#include<iomanip>//该头文件为了后面的输出保留两位小数
#define MAXSIZE 100//初始分配的存储空间
#define OK 1
#define OVERFLOW -2
#define ERROR -1
using namespace std;
typedef struct {
double* base;
double* top;
int stacksize;
} SqStackOPND;//定义运算数栈
int InitStack(SqStackOPND& S) {
S.base = new double[MAXSIZE];//注意 定义为double类型
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}//运算数栈的初始化
int Push(SqStackOPND& S, double e) { //运算数的入栈
if(S.top-S.base==S.stacksize) return ERROR;
*S.top++ = e;
return OK;
}
double Pop(SqStackOPND& S) { //操作数的出栈
double e;
if (S.top == S.base) return ERROR;
e = *--S.top;
return e;
}
double GetTop(SqStackOPND S) { //取运算数栈的栈顶元素
double e;
if (S.top == S.base) return ERROR;
e = *(S.top - 1);
return e;
}
bool In(char c) { //判断ch是否为运算符 不是运算符则进入opnd栈
bool isNumber;
switch (c) {
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '=': isNumber = true; break;
default: isNumber = false; break;
}
return isNumber;
}
double Operate(double a, char top, double b) { //计算弹出OPND栈顶的两个运算数的运算结果
double final = 0;
switch (top) {
case '+': final = a + b; break;
case '-': final = a - b; break;
case '*': final = a * b; break;
case '/': final = a / b; break;
}
return final;
}
double Postfix(char ch) {
SqStackOPND OPND;
InitStack(OPND);//初始化OPTR和OPND栈
char theta;
double a, b;
InitStack(OPND);
while (ch != '=') //表达式没有扫描完毕
{
if(!In(ch))//不是运算符则解析数字字符串然后进操作数栈
{ Push(OPND,ch-48);
cin>>ch;
}
else {
theta = ch;
b = Pop(OPND); //弹出OPND栈顶的两个运算数
a = Pop(OPND);
Push(OPND, Operate(a, theta, b));//将运算结果压入OPND栈
cin>>ch;
} //if
}//while
return GetTop(OPND); // OPND栈顶元素即为表达式求值结果
}
int main() {
char ch;
while (cin>>ch&&ch!='=') {
double cal = Postfix(ch);
cout << fixed << setprecision(2) << cal << endl;//输出保留两位小数
}
return 0;
}