#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAXSIZE 100
#define set_num 8
typedef struct {
char *base;
int top;
int stacksize;
}sqstackc;//构造字符栈
typedef struct{
double *base;
int top;
int stacksize;
}sqstackd;//构造数字栈
void initstackc(sqstackc *s){//初始化字符数组
s->base=(char*)malloc(MAXSIZE * sizeof(char));
s->top=0;
s->stacksize=MAXSIZE;
}
void initstackd(sqstackd *s){
s->base=(double*)malloc(MAXSIZE *sizeof(double));
s->top=0;
s->stacksize=MAXSIZE;
}
int stackcempty(sqstackc *s){
if(s->top==0) return 1;
else return 0;
}
int stackdempty(sqstackd *s){
if(s->top==0) return 1;
else return 0;
}
int stackcfull(sqstackc *s){
if(s->top>=s->stacksize) return 1;
else return 0 ;
}
int stackdfull(sqstackd *s){
if(s->top>=s->stacksize) return 1 ;
else return 0;
}
int pushc(sqstackc *s,char x){
if(stackcfull(s)) return 0;
else {
s->base[s->top]=x;
s->top++;
}
}
int pushd(sqstackd *s,double x){
if(stackdfull(s)) return 0;
else{
s->base[s->top]=x;
s->top++;
}
}
char popc(sqstackc *s){
char x;
if(stackcempty(s)) return 0 ;
else{
x=s->base[s->top-1];
s->top--;
return x;
}
}
double popd(sqstackd *s){
double x;
if(stackdempty(s)) return 0;
else {
x=s->base[s->top-1];
s->top--;
return x;
}
}
//字符优先级数表
unsigned char prior[8][8] =
{
/* '+' '-' '*' '/' '(' ')' '#' '^' */
/*'+'*/'>', '>', '<', '<', '<','>', '>', '<',
/*'-'*/'>', '>', '<', '<', '<','>', '>', '<',
/*'*'*/'>', '>', '>', '>', '<','>', '>', '<',
/*'/'*/'>', '>', '>', '>', '<','>', '>', '<',
/*'('*/'<', '<', '<', '<', '<','=', ' ', '<',
/*')'*/'>', '>', '>', '>', ' ','>', '>', '>',
/*'#'*/'<', '<', '<', '<', '<',' ', '=', '<',
/*'^'*/'>', '>', '>', '>', '<','>', '>', '>'
};
unsigned char priorset[8]={'+','-','*','/','(',')','#','^'};
int findinset(char c){
int i;
for(i=0;i<8;i++){
if(c==priorset[i]) return i;
}
}
char compare(char op,char c){
int i,j;
i=findinset(op);
j=findinset(c);
return prior[i][j];
}
double operate(double a,char c,double b){
switch(c){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
case '^':return pow(a,b);
}
}
char gettop(sqstackc *s){
char x;
x=s->base[s->top-1];
return x;
}
int main(void){
double x,a,b;
sqstackc *note;
note=(sqstackc *)malloc(sizeof(sqstackc));
initstackc(note);
pushc(note,'#');
sqstackd *num;
num=(sqstackd *)malloc(sizeof(sqstackd));
initstackd(num);
char ch;
ch=getchar();
while(ch!='#'||gettop(note)!='#'){
if(ch>='0'&&ch<='9'){
x=ch-'0';
pushd(num,x);
ch=getchar();
}
else{
switch(compare(gettop(note),ch)){
case '<':pushc(note,ch);ch=getchar();break;
case '=':
popc(note);
ch=getchar();
break;
case '>':
b=popd(num);
a=popd(num);
a=operate(a,popc(note),b);
pushd(num,a);
break;
}
}
}
printf("%lf",num->base[num->top-1]);
}
用得是后缀式。