#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
//对于表达式(56-20)/(4+2),其后缀表达式为56#20#-4##2#+/
typedef struct {
double data[100];
int top;
}SqStack;
void push(SqStack* ptr, double data)
{
ptr->data[++ptr->top] = data;
}
double GetTop(SqStack* ptr)
{
return ptr->data[ptr->top];
}
void pop(SqStack* ptr)
{
ptr->top--;
}
double trans(char *postexp)
{
double a, b, c,d=0;
SqStack ptr;
ptr.top = -1;
while (*postexp != '\0')
{
switch (*postexp)
{
case '#':
postexp++;
break;
case'+':
a = GetTop(&ptr);
pop(&ptr);
b = GetTop(&ptr);
pop(&ptr);
c = a + b;
push(&ptr, c);
postexp++;
break;
case'-':
a = GetTop(&ptr);
pop(&ptr);
b = GetTop(&ptr);
pop(&ptr);
c = b - a;
push(&ptr, c);
postexp++;
break;
case'*':
a = GetTop(&ptr);
pop(&ptr);
b = GetTop(&ptr);
pop(&ptr);
c = b * a;
push(&ptr, c);
postexp++;
break;
case'/':
a = GetTop(&ptr);
pop(&ptr);
b = GetTop(&ptr);
pop(&ptr);
c = b / a;;
push(&ptr, c);
postexp++;
break;
default:
while (*postexp >= '0' && *postexp <= '9')
{
d = d * 10 + (*postexp - '0');
postexp++;
}
push(&ptr, d);
d = 0;
break;
}
}
return GetTop(&ptr);
}
int main() {
char exp[100] = "12#3#4+*#6-#8#2/+#";
printf("%.lf",trans(exp));
return 0;
}
这里的后缀表达式也可以写成12#2#4#+*6#-8#2#/+,我个人觉得没什么差别,
我为了好看printf就只打印一位小数点。