打印堆栈的元素

时间:2014-11-03 01:01:14

标签: c++ linked-list stack

我的代码

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

struct node {
    char ch;
    struct node *next;
};
struct node *first,*top1,*newptr;

void push_back(char data) { //Pushes data into the stack
    if (first == NULL) {
        first = new node();
        first->next = NULL;
        first->ch = data;
    }

    else {
        first = new node();
        top1->next = first;
        top1->ch = data;
        first = top1;
    }
}

void display() {
    top1 = first;

    if (top1 == NULL){
        printf("Stack is empty");
        return;
    }

    while (top1 != NULL){
        printf("%c ", top1->ch);
        top1 = top1->next;
    }
}


main() {
    first = NULL;
    char EXP[100];

    scanf("%s",&EXP);
    system("cls");
    int len = strlen(EXP);

    for(int i=0;i<len;i++)
        push_back(EXP[i]);

    display();

    system("pause");
}

我的程序应该为用户提供一个字符串,然后将每个字符放在一个堆栈中,然后我将字符串打印回来。当我运行我的代码时,它只能显示第一个字符。我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

第二次push_back()时,会立即覆盖first

else {
    first = new node();    //oops
    top1->next = first;
    top1->ch = data;
    first = top1;

丢失了之前指出的数据。

答案 1 :(得分:1)

问题是top1未初始化,因此您的程序显示未定义的行为。您最有可能在first top1 {/ 1}}中输入错字。

void push_back(char data) { //Pushes data into the stack
    // ...
    else {
        top1 = new node();
        top1->next = first;
        top1->ch = data;
        first = top1;
    }

答案 2 :(得分:0)

push_back函数和显示功能都有错误。 在跳转到堆栈和链接列表之前,必须在指针和内存分配中构建一个强大的基础。我推荐这篇文章:http://cslibrary.stanford.edu/102/PointersAndMemory.pdf
首先,正如remyabel所提到的,top1应该是你的新节点,而不是第一个节点。首先只是指向堆栈顶部的指针。我希望你能照顾到这一点。来到你的显示功能,你是从最顶层的元素迭代,即,首先它没有意义,因为它指向null并且堆栈从下到上构建,反之则不然。 您必须维护指向堆栈底部的指针。这是一个有效的代码:

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

struct node {
    char ch;
    struct node *next;
};
struct node *first,*top1,*newptr,*stackbottom;

void push_back(char data) { //Pushes data into the stack
    if (first == NULL) {
        first = new node();
        first->next = NULL;
        first->ch = data;
        stackbottom=first;
    }

    else {
        top1 = new node();
        top1->ch = data;    
        first->next = top1;
        first=top1; 
    }
}

void display(){
    //top1 = first;
    struct node *curr;
    curr=stackbottom;
    if (stackbottom == NULL){
        printf("Stack is empty");
        return;
    }

    while (curr != NULL){
        printf("%c ", curr->ch);
        curr = curr->next;
    }
}


main() {
    first = NULL;
    char EXP[100];

    scanf("%s",EXP);

    //system("cls");
    int len = strlen(EXP);

    for(int i=0;i<len;i++)
        push_back(EXP[i]);
    //printf("%c",stackbottom->ch);
        //push_back(EXP[1]);

    display();

    //system("pause");
}