淫令天下 发表于 2015-10-16 15:00:09

逆波兰计算器(真心求你们给看看,我卡这好几天了)

先谢谢你们了! 自己调试了好几天了,应该是‘+’,‘-’号里面出栈有问题,可是实在不知道问题在哪!


static/image/hrline/line6.png

//用栈来做一个逆波兰计算器

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define NUMBER 100//栈的最大容量
#define RENUMBER10//每次动态增容的大小

typedef char ElemType;

typedef struct stack
{
        ElemType *tope;
        ElemType *base;
        int MAXSIZE;//用来存储栈的最大容量
}sqstack;

void initstack(sqstack *s)//初始化栈
{
        s->base = (ElemType *)malloc(sizeof(ElemType) * NUMBER);
        if(!(s->base))
        {
                return ;
        }
        s->tope = s->base;
        s->MAXSIZE = NUMBER;
}

void push(sqstack *s,int e)//进栈
{
        //如果栈满了,就对栈进行一个动态增容
        if(s->tope - s->base >= s->MAXSIZE)
        {
                s->base = (ElemType *)realloc(s->base , sizeof(ElemType) * (RENUMBER + NUMBER));
                if(!s->base)
                {
                        return;
                }
                s->tope = s->base + s->MAXSIZE;
                s->MAXSIZE = NUMBER + RENUMBER;
        }
        *(s->tope) = e;
        s->tope++;
}


void pop (sqstack *s , int *e)//出栈
{
        if (s->tope == s->base)
        {
                printf("错误 : 栈已经为空\n");
                return;
        }
        --(s->tope);
        *e = *(s->tope);

}

void clearstack(sqstack *s)
{
        s->tope = s->base;
}


int main ()
{
        char c;
        int i = 0 ;
        double d = 0 ;double m= 0;
        char temp = {0};
        sqstack s;
        initstack(&s);
        printf("请输入你想要输入的表达式 (数据和运算符之间用空格隔开,输入#表示结束!): \n");
        scanf("%c",&c);
        while (c != '#')
        {
                while( isdigit(c) || c == '.')//过滤数字
                {
                        temp = c;
                        temp = '\0';
                        if( i >= 10)
                        {
                                printf("出错 : 一次性输入的数据过大!\n");
                                return -1;
                        }
                        scanf("%c",&c);//这个scanf保证你输入各位以上的数字的时候能
                        if(c == ' ')
                        {
                                d = atof(temp);
                                push(&s,d);
                                i = 0;
                                break;
                        }
                }
                switch (c)
                {
                case '+':
                        pop(&s,&m);
                        pop(&s,&d);
                        push(&s,d+m);
                        break;
                case '-':
                        pop(&s,&m);
                        pop(&s,&d);
                        push(&s,d-m);
                        break;
                case '*':
                        pop(&s,&m);
                        pop(&s,&d);
                        push(&s,d*m);
                        break;
                case '/':
                        pop(&s,&m);
                        pop(&s,&d);
                        if(m == 0)
                        {
                                printf("错误 : 除数不能为零!\n");
                                return -1;
                        }
                        push(&s,d/m);
                        break;
                }
                scanf("%c",&c);

        }
        pop (&s,&d);
        printf("%f",d);
        return 0;

}

y290176346 发表于 2015-10-16 15:00:10

我用vs2008 你的代码我黏贴后编译器都通不过,我看了下不是加号减号的pop问题 是你的pop push 的参数类型不对,你把你一个浮点型的数据压入到int类型里,本身就失去了小数点后面的位数,然后你又把int类型pop成浮点类型,本身逻辑错误,这个不是问题的最关键,最关键是 定义sqstack结构的 成员是 char指针类型, 也就是说你把一个浮点型的数据 push 到一个int类型的变量 然后再试图存入一个char类型指针变量中,我不是高手, 高手不要笑,我个人认为这个是错误的关键,至于为什么你编译器通过了还运行了 还成出现 一个错误的结果 我也不知道,还要装一个vc6 ,太麻烦,别忘给我鱼币谢谢

淫令天下 发表于 2015-10-17 12:20:17

y290176346 发表于 2015-10-16 15:00
我用vs2008 你的代码我黏贴后编译器都通不过,我看了下不是加号减号的pop问题 是你的pop push 的参数类型 ...

真的十分感谢!之前一直丢失数据的警告什么的不注意!以后不会了!

鱼C工作室.YCGZS 发表于 2015-12-6 11:24:08

没试过:smile

新月传说 发表于 2016-2-15 17:04:37

解决了吗?能发下对的代码吗?

淫令天下 发表于 2016-2-15 18:15:11

新月传说 发表于 2016-2-15 17:04
解决了吗?能发下对的代码吗?

因为不能上传 .c 文件我把后缀名改成.txt了

SDULZY 发表于 2016-2-20 18:16:13

谢谢分享!

TortoisC 发表于 2016-2-24 18:32:16

mark下,以后看

安静的蓝 发表于 2016-10-29 19:23:08

谢谢分享

安静的蓝 发表于 2016-10-29 19:42:16

这个是中缀表达式吧sqstack OPND,OPTR;还想问一下这个是干嘛用的?

淫令天下 发表于 2017-6-11 19:14:23

安静的蓝 发表于 2016-10-29 19:42
这个是中缀表达式吧sqstack OPND,OPTR;还想问一下这个是干嘛用的?

就是小白简单的用栈写的一个计算器而已,要交作业的

xxz7604 发表于 2017-6-16 08:34:15

循环那里一个push函数调用没加取地址符
页: [1]
查看完整版本: 逆波兰计算器(真心求你们给看看,我卡这好几天了)