NO COPYING!
NO COPYING!
NO COPYING!
//Sinhaeng Hhjian
//前缀表达式
#include<bits/stdc++.h>
#define MAX 100
using namespace std;
struct Stack{
double *base;
int top;
};
void Push(Stack &s, double bt){
s.base[++s.top] = bt;
}
int GetTop(Stack s, double &bt){
if(!s.top)
return 0;
bt = s.base[s.top];
return 1;
}
int IsSEmpty(Stack s){
return s.top==0? 1 : 0;
}
void InitStack(Stack &s){
s.base = (double *)malloc(MAX*(sizeof(double)));
s.top=0;
}
void Pop(Stack &s){
if(IsSEmpty(s))
return ;
s.top--;
}
double calculator(char str[]){
Stack s;
InitStack(s);
int len=strlen(str), i=len-1;
while ( i >= 0 ){
if (str[i]==' ')
i--;
else if (str[i] >= '0' && str[i] <= '9') {
Stack temp;
InitStack(temp);
while (i >=0 && str[i] >= '0' && str[i] <= '9'){
Push(temp, str[i]-'0');
i--;
}
int num=0;
while(!IsSEmpty(temp)){
double bt;
GetTop(temp, bt);
Pop(temp);
num=num*10+bt;
}
Push(s, num);
}
else {
double num1, num2, num3;
GetTop(s, num1);Pop(s);
GetTop(s, num2);Pop(s);
if (str[i] == '+')
num3 = num1 + num2;
else if (str[i] == '-')
num3 = num1 - num2;
else if (str[i] == '*')
num3 = num1 * num2;
else if (str[i] == '/')
num3 = num1 / num2;
Push(s, num3);
i--;
}
}
return s.base[s.top];
}
int main(){
char s[]="+ + + + + 1 * - 2 3 4 / 10 2 * 2 2 2 / 2 5";
printf("前缀表达式为:%s\n", s);
double ans=calculator(s);
printf("计算结果:%f\n", ans);
return 0;
}