逆波兰表达式
源代码如下:#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>//要用到isdigit()
#define INCREASEMENT 10//若栈空间不够,每次多申请INCREASEMENT这么多空间
#define MAXSIZE 100
#define BUFFER 10
#define OK 1
#define ERROR 0
typedef double ElemType;
typedef int Stutas;
typedef struct
{
ElemType *top;
ElemType *base;
int stacksize;//目前栈最大容量
}SqStack;
//创建一个栈
Stutas Init(SqStack *S)
{
S->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
if(!S->base)
{
printf("error:内存分配出错!\n");
return ERROR;
}
S->top = S->base;
S->stacksize = MAXSIZE;
return OK;
}
//入栈操作,将元素e压入栈
Stutas Push(SqStack *S,ElemType e)
{
if(S->top-S->base == S->stacksize)//栈空间不够用,则追加INCREASEMENT这么多空间
{
S->base = (ElemType*)realloc(S->base,(S->stacksize+INCREASEMENT)*sizeof(ElemType));
if(!S->base)
{
printf("error:内存分配出错!\n");
return ERROR;
}
S->top = S->base+S->stacksize;//设置栈顶
S->stacksize = S->stacksize+INCREASEMENT;//设置栈可用空间
}
*(S->top) = e;
S->top++;
return OK;
}
//出栈操作,删除栈顶元素,赋值给e
Stutas Pop(SqStack *S,ElemType *e)
{
if(S->top == S->base)//如果栈空,则显示出错信息
{
printf("栈为空,不能删除栈顶元素!");
return ERROR;
}
*e = *(S->top-1);
S->top--;
return OK;
}
int main()
{
char e;
double c,d;
SqStack S;
char str;
int i = 0;
Init(&S);
printf("请输入逆波兰表达式,数字与表达式之间用空格隔开,整个表达式用#结束!\n");
scanf("%c",&e);//怎么转换为数字
getchar();
while( e != '#' )
{
while( isdigit(e) || e=='.')//注意怎么处理字符到数字的转换,以及怎么支持浮点型数据的,定义一个buffer
{
str = e;
i++;
str = '\0';
if( i>= BUFFER )
{
printf("输入的数字超过给定的精度\n");
return -1;
}
scanf("%c",&e);
getchar();
if( e == ' ' )
{
d = atof(str);//atof()将一个字符串转换为浮点型数
Push(&S,d);
i = 0;
break;
}
}
switch( e )//用switch较好,可以很好地+-*/,否则无法实现
{
case '+':
Pop(&S,&c);
Pop(&S,&d);
Push(&S,d+c);
break;
case '-':
Pop(&S,&c);
Pop(&S,&d);
Push(&S,d-c);//对于减的时候,d先还是c先很重要
break;
case '*':
Pop(&S,&c);
Pop(&S,&d);
Push(&S,d*c);
break;
case '/':
Pop(&S,&c);
Pop(&S,&d);
if( c== 0)
{
printf("分子不能为0\n");
return -1;
}
else
{
Push(&S,d/c);//对于除的时候,d先还是c先很重要
break;
}
}
scanf("%c",&e);
getchar();
}
printf("最终的结果是:\n");
Pop(&S,&d);
printf("%f\n",d);
return 0;
}
问题如下:
小甲鱼老师说没有这句的话,会出错str = '\0';
但是我的没有也不会出错,请问问题是什么? :mad:我看不懂 好深奥啊 看不懂啊 水平太差了 唉:cry lz就不能直接告诉我们哪里有问题吗???这么长段代码表示没看的欲望。 小亮1201 发表于 2013-12-6 17:15 static/image/common/back.gif
lz就不能直接告诉我们哪里有问题吗???这么长段代码表示没看的欲望。
问题就是为什么str='\0';
小甲鱼说没有的话会出问题,但是我没见也没有问题,求问为什么一定要加?
页:
[1]