您的位置:首页 > 其它

逆波兰式(后缀表达式)的计算

2014-12-15 12:48 183 查看
输入 :后缀表达式(可带浮点数)

输出:double型的计算结果

代码:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define ElemType double
#define Stack_Init_Size 100
#define Increase_Size 10
#define MaxBuffer 10
typedef struct sqStack
{
ElemType *top;
ElemType *base;
int initSize;
}sqStack;
typedef struct sqStack *LinkStack;

//初始化
void InitStack( sqStack *s )
{
s->base = (LinkStack)malloc(Stack_Init_Size * sizeof(ElemType));
if(!s->base)
{
printf("存储空间分配失败······\n");
return;
}
s->top = s->base;
s->initSize = Stack_Init_Size;
}
//进栈
void Push(sqStack *s,ElemType e)
{
if(s->top - s->base >= s->initSize - 1)
{
s->base = (LinkStack)realloc(s->base,(s->initSize + Increase_Size) * sizeof(ElemType));
//第一个s->base是增加后的存储空间块的地址,第二个是增加空间之前的存储空间块地址,后面是增加过的存储空间块的大小
if(!s->base)
{
printf("增加存储空间失败······\n");
return;
}
s->initSize = Increase_Size + Stack_Init_Size;
}
*(s->top) = e;
(s->top)++;
}
//出栈
void Pop(sqStack *s,ElemType *e)
{
if(s->top == s->base)
{
printf("栈已空,无法进行出栈操作······\n");
return;
}
s->top--;
*e = *s->top;
}
//求栈的长度
int StackLen(sqStack s)
{
return (s.top - s.base);
}

//逆波兰计算器:输入逆波兰式(后缀表达式)输出结果
int main()
{
int i = 0,j,len;
double m,n,t;
char c;
struct sqStack s;
char str[MaxBuffer];
InitStack(&s);
printf("请输入您要计算的后缀表达式,按Enter键结束(两个不同的字符之间用空格隔开):\n");
scanf("%c",&c);
while(c != '\n')
{
while( (c >= '0'&&c <= '9') || c == '.')
{
str[i] = c;
i++;
//           str[i] = '\0';
if(i >= 10)
{
printf("\n输入的数字过大导致出错!!!\n");
return -1;
}
scanf("%c",&c);
if( c == ' ')
{
t = atof(str);
//              printf("\nt is %f\n",t);
Push(&s,t);
i = 0;
for(j = 0;j < MaxBuffer;j++)
{
str[j] = '\0';
}
break;
}

}
switch( c )
{
case '+':
Pop(&s,&m);
Pop(&s,&n);
Push(&s,n+m);
break;
case '-':
Pop(&s,&m);
Pop(&s,&n);
Push(&s,n-m);
break;
case '*':
Pop(&s,&m);
Pop(&s,&n);
Push(&s,n*m);
break;
case '/':
Pop(&s,&m);
Pop(&s,&n);
if( m == 0)
{
printf("\n除数为0,出错!!!\n");
return -1;
}
else
{
Push(&s,n/m);
break;
}
}

scanf("%c",&c);
}

Pop(&s,&t);
printf("\n最终的计算结果为:%f \n",t);
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐