鱼C论坛

 找回密码
 立即注册
查看: 2506|回复: 1

小白求助,这个逆波兰算法的push和pop为什么运行不了

[复制链接]
发表于 2019-7-19 16:47:29 | 显示全部楼层 |阅读模式

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

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

x
学了半个月的c语言。我们学校的一道考试题,其中push()和pop()还有free_stack()是自己写的,free_stack()的作用是如果栈为空的场合返回真,如果不是,则释放所有栈的元素并返回假。

push()的话我想用*sp指向新建的*n为什么说是NULL值不能用??



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

#define NULL ((void *)0)
#define OK 1
#define ERROR 0

extern int error;

struct element
{
        struct element *next;
        int data;

};

struct element *sp = NULL;
int error = 0;

void push(int x) {
        struct element *n;
        n = malloc(sizeof(struct element));
        *sp->next = *n;
        n->data=x;
        *sp = *n;
}

int free_stack() {
        if (sp==0)
                return OK;
        else
                return ERROR;
}

int pop() {
        int x;
        struct element *f;
        if (!sp) {
                error = 1;
                return(0);
        }
        x = sp->data;
        f = sp;
        sp=sp--;
        free(f);
        return(x);

}

void init_stack() {
        free_stack();
        sp = NULL;
        error = 0;
}



void do_num(char *s) {
        int a;
        a = atoi(s);
        push(a);
}

void do_add() {
        int a, b;
        b = pop();
        a = pop();
        push(a + b);
}

void do_sub() {
        int a, b;
        b = pop();
        a = pop();
        push(a - b);
}

void do_eq() {
        int a, b;
        b = pop();
        a = pop();
        push(a == b);
}

void do_not() {
        int a;
        a = pop();
        push(!a);
}

void do_cond() {
        int a, b, c;
        c = pop();
        b = pop();
        a = pop();
        if (a)
                push(b);
        else
                push(c);
}


int calc(char *exp[], int *xp) {
        init_stack();
        for (int i = 0; exp[i] != NULL; i++) {
                if (isdigit(exp[i][0]))
                        do_num(exp[i]);
                else if (strcmp(exp[i], "+") == 0)
                        do_add();
                else if (strcmp(exp[i], "-") == 0)
                        do_sub();
                else if (strcmp(exp[i], "==") == 0)
                        do_eq();
                else if (strcmp(exp[i], "!") == 0)
                        do_not();
                else if (strcmp(exp[i], "?") == 0)
                        do_cond();
                else {
                        free_stack();
                        return(ERROR);
                }
        }

        *xp = pop();
        free_stack();
        if (error)
                return(ERROR);
        else
                return(OK);

}

int main() {
        int x = 0;
        char *exp[] = { "30","50","+",NULL };
        if (calc(exp, &x) == OK)
                printf("the result is %d\n", x);
        else
                printf("Error\n");
        return(0);
       
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-1 21:21:51 | 显示全部楼层
#define NULL ((void *)0)  重定义了, n = malloc(sizeof(struct element));并且整型与指针型数据的转换错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 10:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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