使用pop后无法推送

时间:2014-10-14 18:24:25

标签: c stack push pop

我已经在这里工作了大约7个小时试图让我自己开始工作,但我无法理解。通过我之前的测试,我能够成功地将我的char []的所有值完全推送到堆栈中,然后我可以正确地将它们弹出并返回值。 但是,如果我尝试将某些东西推回堆栈,则整个程序崩溃。

注意:

  • 该代码应该用于稍后在表达式树上创建节点

  • switch语句中注释掉的代码是我在发生错误时所拥有的代码,只是在我可以修复它时保存它。

- 使用弹出后按下,正确调用该函数,但是它不会在push中输入if或else语句。

以下是代码:

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

typedef struct Stack;
typedef struct StackNode;
typedef struct StackPtr;


struct StackPtr
{
    struct StackPtr *prev;
    struct StackNode *ptr;
};

struct StackNode
{
    char c;
    struct StackNode *lchild;
    struct StackNode *rchild;
};

struct Stack
{
    struct StackPtr *top;
};

// Prototypes

void initStack(struct Stack*);
struct StackNode* createNode(char);
struct StackNode* pop(struct Stack*);
void push(struct Stack*, struct StackNode*);
int isEmpty(struct Stack*);




int main()
{
    struct Stack *s = malloc(sizeof(s));
    initStack(s);
    char exp[7] = "45+67+*";
    int length = 0;

    for(length; length<3; length++) // push the expression onto the stack
    {
        struct StackNode *exp1 = malloc(sizeof(exp1));
        struct StackNode *exp2 = malloc(sizeof(exp2));
        struct StackNode *c = malloc(sizeof(c));

        if(exp[length] > 47 && exp[length] < 58) // is a number
        {
            c->c = exp[length];
            push(s,c);
        }

        else
        {
            switch(exp[length])
            {
            default:
                printf("exp[length] error\n");
                break;
            case '+':
                exp2 = pop(s);
                exp1 = pop(s);

                c->c = '7';
                push(s, c);
                //push(s, exp1->ptr);
                //push(s, exp2->ptr);
                //c->c = exp[length];
                //c->rchild = exp2;
                //c->lchild = exp1;
                //printf("test ");
                //push(s, c);
                //printf("test ");
                break;
            case '-':
                break;
            case '*':
                break;
            case '/':
                break;
            }
        }
    }

    return 0;
}

void initStack(struct Stack *s)
{
    struct StackNode *n = malloc(sizeof(n));
    struct StackPtr *p = malloc(sizeof(p));

    n->c = NULL;
    n->lchild = NULL;
    n->rchild = NULL;
    p->prev = NULL;
    p->ptr = n;
    s->top = p;
}

struct StackNode* createNode(char c)
{
    struct StackNode *n = malloc(sizeof(n));
    n->c = c;
    n->lchild = NULL;
    n->rchild = NULL;
    return n;
}

void push(struct Stack *s, struct StackNode *n)
{
    if(s->top->ptr->c == NULL) // First item being pushed
    {
        s->top->ptr = n;
        printf("1Added: %c to the stack\n", n->c);
    }
    else
    {
        struct StackPtr *o = malloc(sizeof(o));
        o->prev = s->top;
        s->top = o;
        s->top->ptr = n;
        printf("2Added: %c to the stack\n", n->c);
    }
}

struct StackNode* pop(struct Stack *s)
{
    if(isEmpty(s) == 1)
    {
        printf("Stack is empty!\n");
        return;
    }
    else
    {
        struct StackPtr *tmp = malloc(sizeof(tmp));
        tmp = s->top;
        s->top = s->top->prev;
        printf("Popped: %c from the stack.\n",tmp->ptr->c);
        return tmp->ptr;
    }
}


int isEmpty(struct Stack *s)
{
    if(s->top == NULL)
        return 1;
    else
        return 0; // false

非常感谢任何帮助,非常感谢!

1 个答案:

答案 0 :(得分:2)

您的POP功能正在设置

       s->top = s->top->prev;

在弹出两个节点后,Prev值为NULL,因此top指向NULL,这导致下一个PUSH期间的分段错误

要考虑更多的事情,将值更改为8而不是7,因为\ 0需要适合。或者用它作为 char exp []

       char exp[8] = "45+67+*";