/*计算后缀表达式(加强版),可运算‘+ - * /’可以多位数并且可以带小数进行运算,两个运算数据之间用空格隔开,如:1.1 2.2+ 遇到#符号,运算结束 打印运算结果*/
//头文件
#ifndef _Three19a_H
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
typedef PtrToNode Position;
Stack CreateStack();
double PopTop(Stack s);
void Push(Stack s,double c);
struct Node{
double c;
Position next;
};
#endif
/********************************************************************************************************/
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "three19a.h"
//建栈
Stack CreateStack()
{
Stack s;
s=(Stack)malloc(sizeof(struct Node));
if(s==NULL)
{
printf("error");
return NULL;
}
s->next=NULL;
return s;
}
//出栈并返回栈顶元素
double PopTop(Stack s)
{
Position p;
double ch ;
if(s->next==NULL)
{
printf("error");
return -1;
}
else
{
p=s->next;
ch=p->c;
s->next=s->next->next;
free(p);
}
return ch;
}
//返回栈顶元素
double Top(Stack s)
{
if(s->next==NULL)
{
printf("error");
return -1;
}
else
return s->next->c;
}
//入栈
void Push(Stack s,double c)
{
Position p;
p=(Position)malloc(sizeof(struct Node));
if(p==NULL)
{
printf("error");
return ;
}
else
{
p->c=c;
p->next=s->next;
s->next=p;
}
}
main()
{
int j=0;
double op2;
char ch;
char a[100];
Stack s=CreateStack();
while((ch=getchar())!='#')
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/')//是符号就弹出数值进行运算,运算结果入栈。
{
switch(ch)
{
case '+':
Push(s,PopTop(s)+PopTop(s));
break;
case '-':
op2=PopTop(s);
Push(s,PopTop(s)-op2);
break;
case '*':
Push(s,PopTop(s)*PopTop(s));
break;
case '/':
op2=PopTop(s);
if(op2!=0)
Push(s,PopTop(s)/op2);
else
printf("error");
break;
}
}
else
{
if(isdigit(ch))//如果是数字字符,存到数组中
{
j=0;
a[j]=ch;
while(isdigit(ch=getchar())||ch=='.')//看接下来的输入是否还是数字字符,是的话继续存在数组中,如果不是结束循环。
a[++j]=ch;
a[j+1]='\0';
Push(s,atof(a));//atof(a)把字符串转换为浮点数,压入栈中。
/*在上述while循环中,到取到字符不是数字字符时,结束循环,这个取到的字符有可能是空格,也有可能是运算符,
如果是空格就不必管了;
如果是运算符;要重新放回到输入流中,下次取字符时才能够取到。*/
if(ch!=' ')
}
}
}
printf("%f",PopTop(s));
}