幽梦三影 发表于 2018-4-24 20:31:55

逆波兰表达式哪里错了

本帖最后由 幽梦三影 于 2018-4-24 22:20 编辑

//逆波兰表达式
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<ctype.h>
#define stack_int_size 20
#define expand 10
typedef double elemtype;
typedef struct
{
        elemtype *top;
        elemtype *base;
        int stacksize;
}
stack;
//创建一个栈
void creatstack(stack* s)
{
        s->base=(elemtype*)malloc(stack_int_size*sizeof(elemtype));
        if(!(s->base))
                exit(0);
        s->top=s->base;
        s->stacksize=stack_int_size;
}
//插入操作
void push(stack* s,elemtype e)
{
        if(s->top-s->base>=s->stacksize)
                s->base=(elemtype*)realloc(s->base,(s->stacksize+expand)*sizeof(elemtype));
        if(!(s->base))
                exit(0);
        s->top=s->base+s->stacksize;
        s->stacksize=s->stacksize+expand;
        *(s->top)=e;
        s->top++;
}
//删除操作
void pop(stack* s,elemtype e)
{
        if(s->top==s->base)
                printf("空栈!");
        return;
        --(s->top);
        e=*(s->top)
}
int main()
{
        stack s;
        int i=0;
        char c,m;
        //m为缓冲区,存放输入的字符
        double d,e,f,l;//用于暂时存放输入的数据,并进行相互运算
        creatstack(&s);
        printf("请输入逆波兰算数式:\n");
        scanf("%c",&c);
        while(c!='#') //用#作为结束
        {
                while(isdigit(c)||c=='.')
                {
                        m=c;
                        m='\0';
                        //这是什么用啊?
                        scanf("%c",&c);
                        if(c==' ') //用空格终止一次循环,在外层while循环结尾再输入c再次进入循环
                        {
                                f=atof(m);//把m缓冲区中的小数字符转换成double型
                                push(&s,f);
                                i=0;
                                break;
                        }
                }
                switch(c)
                {
                case '+':
                        pop(&s,d);
                        pop(&s,e);
                        push(&s,d+e);
                        break;
                case '-':
                        pop(&s,d);
                        pop(&s,e);
                        push(&s,e-d);
                        break;
                case '*':
                        pop(&s,d);
                        pop(&s,e);
                        push(&s,d*e);
                        break;
                case '/':
                        pop(&s,d);
                        pop(&s,e);
                        if(e==0) //分母不为0
                        {
                                printf("error\n");
                                return -1;
                        } else
                        push(&s,e/d);
                        break;
                }
                scanf("%c",&c);
        }
        pop(&s,l);
        printf("\n%lf\n",l);
        return 0;
}

ABC23 发表于 2018-4-27 01:20:34

m是个数组,你直接赋值了

幽梦三影 发表于 2018-4-28 13:52:37

本帖最后由 幽梦三影 于 2018-4-28 13:54 编辑

ABC23 发表于 2018-4-27 01:20
m是个数组,你直接赋值了

改过来了
1 2 +运行后得2啊

python挥手 发表于 2018-4-30 11:10:11

幽梦三影 发表于 2018-4-28 13:52
改过来了
1 2 +运行后得2啊

我也是这样的,总感觉小甲鱼哪里不对

人造人 发表于 2018-4-30 12:01:56

HelloLife 发表于 2020-4-23 10:05:11

幽梦三影 发表于 2018-4-28 13:52
改过来了
1 2 +运行后得2啊

它的返回值始终是最后输入的那个数字,但是小甲鱼自己运行就没问题

猪敏 发表于 2020-4-26 15:47:59

HelloLife 发表于 2020-4-23 10:05
它的返回值始终是最后输入的那个数字,但是小甲鱼自己运行就没问题

为什么小甲鱼自己运行是对的,我们是出错的,我照的他的代码敲的,运行之后输之后就错了

HelloLife 发表于 2020-4-26 17:01:05

猪敏 发表于 2020-4-26 15:47
为什么小甲鱼自己运行是对的,我们是出错的,我照的他的代码敲的,运行之后输之后就错了

typedef double ElemType;你们看一下是不是这里的数据类型没改

猪敏 发表于 2020-4-26 21:19:19

HelloLife 发表于 2020-4-26 17:01
typedef double ElemType;你们看一下是不是这里的数据类型没改

不应该是double吗

HelloLife 发表于 2020-4-27 16:03:40

猪敏 发表于 2020-4-26 21:19
不应该是double吗

就是double
页: [1]
查看完整版本: 逆波兰表达式哪里错了