#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
typedef double ElemType;
typedef struct StackNode
{
ElemType data; //存放栈的数据
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top; //top指针
int count; //栈元素计数器
}LinkStack;
//初始化
void InitLinkStack(LinkStack *s)
{
s->top=NULL;
s->count=0;
}
//入栈
void Push(LinkStack *s,ElemType e)
{
LinkStackPtr p=(LinkStackPtr)malloc(sizeof(StackNode));
p->data=e;
p->next=s->top;
s->top=p;
s->count++;
}
//判断栈是否为空
int StackEmpty(LinkStack s)
{
if(s.top==NULL)
{
printf("空栈");
return 0;
}
return 1;
}
//出栈
void Pop(LinkStack *s,ElemType *e)
{
LinkStackPtr p;
if(StackEmpty(*s))
{
*e=s->top->data;
p=s->top;
s->top=s->top->next;
free(p);
s->count--;
}
}
int main()
{
LinkStack s;
InitLinkStack(&s);
char c;
double d,e;
char str[10];
int i=0;
printf("请按输入逆波兰表达式输入待计算数据,数据与运算符之间用空格隔开,以#作为结束标志\n");
scanf("%c",&c);
while(c!='#')
{
while(isdigit(c)||c=='.') //isdigit(c)判断c是否为数字
{
str[i++]=c;
str[i]='\0';
if(i>=10)
{
printf("输入的数据过大\n");
return -1;
}
scanf("%c",&c);
if(c==' ')
{
d=atof(str); //将字符串转换为double型数据
Push(&s,d);
i=0;
break;
}
}
switch(c)
{
case '+':
Pop(&s,&d);
Pop(&s,&e);
Push(&s,e+d);
break;
case '-':
Pop(&s,&e);
Pop(&s,&d);
Push(&s,d-e);
break;
case '*':
Pop(&s,&e);
Pop(&s,&d);
Push(&s,d*e);
break;
case '/':
Pop(&s,&e);
Pop(&s,&d);
if(e==0)
{
printf("除数为0,错误!");
return -1;
}
Push(&s,d/e);
break;
}
scanf("%c",&c);
}
Pop(&s,&d);
printf("运算结果为:%f\n",d);
return 0;
}
逆波兰计算器---C语言
最新推荐文章于 2023-01-13 19:48:35 发布