!!后缀表达式的基本思想:只要遇见了字符,就取出栈的两个数据进行运算
## 描述
从键盘上输入一个后缀表达式,试编写算法计算表达式的值。规定:后缀表达式的长度不超过一行,以“=”作为输入结束,操作数之间用空格分隔,操作符只可能有+、−、*、/四种运算。
输入
多组数据,每组数据一行,对应一个后缀算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。
输出
对于每组数据输出一行,为表达式的运算结果。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 100
typedef struct {
double *base;
double *top;
int maxsize;
}Stack;
void Initstack(Stack &mysatck) {
mysatck.base = new double[MAX];
mysatck.top = mysatck.base;
mysatck.maxsize = MAX;
}
double top(Stack mysatck) {
return *(mysatck.top - 1);
}
void push(Stack &mystack, double e) { //默认栈不满
*(mystack.top) = e;
mystack.top++;
}
void pop(Stack &mystack) { //判空
mystack.top--;
}
void Calculate(Stack &mystack, char c) {
if (c == '+') {
double b = top(mystack); //右
pop(mystack);
double a = top(mystack); //左
pop(mystack);
double sum = a + b;
push(mystack, sum);
}
else if (c == '-') {
double b = top(mystack); //右
pop(mystack);
double a = top(mystack); //左
pop(mystack);
double sum = a - b;
push(mystack, sum);
}
else if (c == '*') {
double b = top(mystack); //右
pop(mystack);
double a = top(mystack); //左
pop(mystack);
double sum = a * b;
push(mystack, sum);
}
else if (c == '/') {
double b = top(mystack); //右
pop(mystack);
double a = top(mystack); //左
pop(mystack);
double sum = a / b;
push(mystack, sum);
}
}
int main() {
char s[100];
while (true)//这里由于需要读入空格,因此用cin,scanf读入不方便(遇见空格自动停止)
{
fgets(s, 100, stdin); //读取一整行,包括换行符\n
if (s[0] == '=')
break;
Stack mystack;
Initstack(mystack);//建栈+初始化
for (int i = 0; s[i] != '='; i++) {
if (s[i] >= '0'&&s[i] <= '9') { //数字入栈
double num = atof(s + i);
push(mystack, num);
/* while ((s[i] >= '0' && s[i] <= '9') || s[i] == '.') //涉及到小数时可用
{
i++; //寻找数字的组成部分
}
i--; //回到遍历的数字de末尾
*/
}
//空格跳过
else if (s[i] == ' ')
continue;
else //运算符
{
char c = s[i];
Calculate(mystack, c); //计算
}
}
printf("%.2lf\n", top(mystack));//最后的栈顶元素 即为结果
pop(mystack);
}
}