创建临时堆栈以在 c 中打印它

creating temp stack to print it in c

我和当前的大学学生的任务是使用以下结构创建堆栈

typedef char stackitem;

struct stack {
stackitem  d;
struct stack *next;
};

typedef  struct stack ELEMENT;
typedef  ELEMENT   *POINTER;

我在打印堆栈时遇到问题。我想要做的是创建一个临时堆栈,我在其中打印元素然后将其弹出。但是它似乎正在从我不想要的原始堆栈中删除它。

代码如下:

void print_stack(POINTER Top)
/*Print the contents of the stack. Do not modify the stack in any way. */
    {
        POINTER temp = Top;
    
        printf("Start printing the stack ...\n");
        
        while (temp != NULL){
        printf("%c\n",temp->d);
        pop(&temp);
        }

    }
void pop(POINTER *Top)
/* Remove the top item */
     {
        POINTER Top1 = *Top;
        if (Top != NULL)
        {
          *Top = Top1->next;
         // printf("Remove element %c\n", Top1->d);
          free(Top1);
        }
        else
          printf("Empty stack.\n");
     }

在我看来,我正在从临时指针打印和弹出,这不应该影响原始指针顶部但是当我插入堆栈并打印它时,第一次打印正确然后第二次打印什么都不打印.

这是我的主

POINTER top;
        top= (POINTER) NULL;
        stackitem A='A';
        stackitem B='B';
        push(&top,A);
        push(&top,B);
        print_stack(top); // prints B A 
        print_stack(top); // prints nothing

对出了什么问题有帮助吗?

print_stack 函数声称它不会修改堆栈,但确实如此。例如,它调用 pop 调用 free,销毁堆栈顶部的对象。

正如另一位用户所建议的,您不会创建第二个堆栈,而只是创建第二个指针来显示与原始堆栈相同的内存位置。

如果我是你,我会尝试将堆栈添加到一个数组 (you can search for guidance here) 中,然后修改该数组。这样你的原始堆栈就不会受到伤害。

您的 print_stack() 方法当前如下所示:

void print_stack(POINTER Top) {
    POINTER temp = Top;

    printf("Start printing the stack ...\n");

    while (temp != NULL){
        printf("%c\n",temp->d);
        pop(&temp); // Calling `pop()` will modify your Stack
    }
}

您在修改堆栈的循环中调用 pop();这不好,因为 print_stack 是读取操作,不应修改列表。您可以改为只增加指针,使其指向下一个值:

void print_stack(POINTER Top) {
    POINTER temp = Top;

    printf("Start printing the stack ...\n");

    while (temp != NULL){
        printf("%c\n",temp->d);
        temp = temp->next; // Go to next element of stack
    }
}

我测试了这段代码(我只需要添加不存在的额外 pushcreateNewStackNode 方法:

// ...

POINTER createNewStackNode(stackitem i) {
    POINTER newNode = (POINTER) malloc(sizeof(ELEMENT));
    newNode->d = i;
    newNode->next = NULL;
    return newNode;
}

void push(POINTER *top, char item) {
    POINTER curr = createNewStackNode(item);
    curr->next = *top;
    *top = curr;
}

// ...

int main() {
    POINTER top;
    top= (POINTER) NULL;
    stackitem A='A';
    stackitem B='B';
    push(&top,A);
    push(&top,B);
    print_stack(top); // prints B A 
    push(&top, 'C');
    push(&top, 'D');
    push(&top, 'E');
    push(&top, 'F');
    print_stack(top);
}

这将打印以下输出:

Start printing the stack ...
B
A
Start printing the stack ...
F
E
D
C
B
A