鱼C论坛

 找回密码
 立即注册
查看: 3929|回复: 4

逆波兰表达式

[复制链接]
发表于 2013-12-6 10:53:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
源代码如下:
#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[BUFFER];
        int i = 0;
       
        Init(&S);
        printf("请输入逆波兰表达式,数字与表达式之间用空格隔开,整个表达式用#结束!\n");
        scanf("%c",&e);//怎么转换为数字
        getchar();
        while( e != '#' )
        {
                while( isdigit(e) || e=='.')//注意怎么处理字符到数字的转换,以及怎么支持浮点型数据的,定义一个buffer
                {
                        str[i] = e;
                        i++;
                        str[i] = '\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[i] = '\0';
但是我的没有也不会出错,请问问题是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-6 11:45:17 | 显示全部楼层
:mad:我看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-6 12:12:59 | 显示全部楼层
好深奥啊   看不懂啊   水平太差了 唉:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-6 17:15:36 | 显示全部楼层
lz就不能直接告诉我们哪里有问题吗???这么长段代码表示没看的欲望。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-11 22:07:35 | 显示全部楼层

问题就是为什么str[i]='\0';
小甲鱼说没有的话会出问题,但是我没见也没有问题,求问为什么一定要加?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 04:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表