鱼C论坛

 找回密码
 立即注册
查看: 5983|回复: 11

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

[复制链接]
发表于 2015-10-16 15:00:09 | 显示全部楼层 |阅读模式
5鱼币
先谢谢你们了! 自己调试了好几天了,应该是‘+’,‘-’号里面出栈有问题,可是实在不知道问题在哪!



                               
登录/注册后可看大图

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

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

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

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[10] = {0};
        sqstack s;
        initstack(&s);
        printf("请输入你想要输入的表达式 (数据和运算符之间用空格隔开,输入#表示结束!): \n");
        scanf("%c",&c);
        while (c != '#')
        {
                while( isdigit(c) || c == '.')//过滤数字
                {
                        temp[i++] = c;
                        temp[i] = '\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;

}
QQ图片20151016145952.jpg

最佳答案

查看完整内容

我用vs2008 你的代码我黏贴后编译器都通不过,我看了下不是 加号减号的pop问题 是你的pop push 的参数类型不对,你把你一个浮点型的数据压入到int类型里,本身就失去了小数点后面的位数,然后你又把int类型pop成浮点类型,本身逻辑错误,这个不是问题的最关键,最关键是 定义sqstack结构的 成员是 char指针类型, 也就是说你把一个浮点型的数据 push 到一个int类型的变量 然后再试图存入一个char类型指针变量中,我不是高手, 高 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-16 15:00:10 | 显示全部楼层
我用vs2008 你的代码我黏贴后编译器都通不过,我看了下不是  加号减号的pop问题 是你的pop push 的参数类型不对,你把你一个浮点型的数据压入到int类型里,本身就失去了小数点后面的位数,然后你又把int类型pop成浮点类型,本身逻辑错误,这个不是问题的最关键,最关键是 定义sqstack结构的 成员是 char指针类型, 也就是说你把一个浮点型的数据 push 到一个int类型的变量 然后再试图存入一个char类型指针变量中,我不是高手, 高手不要笑,我个人认为这个是错误的关键,至于为什么你编译器通过了还运行了 还成出现 一个错误的结果 我也不知道,还要装一个vc6 ,太麻烦,别忘给我鱼币谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

真的十分感谢!之前一直丢失数据的警告什么的不注意!以后不会了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-6 11:24:08 | 显示全部楼层
没试过:smile
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-15 17:04:37 | 显示全部楼层
解决了吗?能发下对的代码吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-2-15 18:15:11 | 显示全部楼层
新月传说 发表于 2016-2-15 17:04
解决了吗?能发下对的代码吗?

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

jisuanqi.txt

3.81 KB, 下载次数: 48

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-20 18:16:13 | 显示全部楼层
谢谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-24 18:32:16 | 显示全部楼层
mark下,以后看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-29 19:23:08 | 显示全部楼层
谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-29 19:42:16 | 显示全部楼层
这个是中缀表达式吧sqstack OPND,OPTR;还想问一下这个是干嘛用的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-6-11 19:14:23 | 显示全部楼层
安静的蓝 发表于 2016-10-29 19:42
这个是中缀表达式吧sqstack OPND,OPTR;还想问一下这个是干嘛用的?

就是小白简单的用栈写的一个计算器而已,要交作业的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-16 08:34:15 | 显示全部楼层
循环那里一个push函数调用没加取地址符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 20:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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