0

我正在尝试在 C++ 中实现堆栈,但是当我尝试打印堆栈时,它只打印第一个元素而不是整个堆栈。我已经测试过了,我很确定我的 Push 功能是正确的,但我不确定。

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

int main(){

    StackElement *stack = new StackElement();
    stack->data = 20;
    stack->Push(30,stack);
    stack->Push(40,stack);

    stack->Print(stack);

}

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


class StackElement{

public:

    int data;   
    StackElement* next;     
    StackElement();     
    void StackElement::Push(int value, StackElement *oldElement);   
    void StackElement::Print(StackElement *element); 
};

StackElement::StackElement(){
    next = NULL;
}


void StackElement::Push(int value, StackElement *oldElement){

    StackElement *newElement = new StackElement();                
    newElement->data = value;       
    printf("Element added to stack: %d\n", newElement->data);       
    oldElement->next = newElement;       
}


void StackElement::Print(StackElement *element){

    while(element->next != NULL){       
        printf("%d\n",element->data);       
        element = element->next;    
    }

}
4

2 回答 2

1

正如@Beta 所述,您的代码不断丢失先前推送的元素,泄漏内存。

我建议将下面的代码与您的代码进行比较。您会看到,我已经将堆栈元素的处理移到了外部,只是为了能够跟踪第一个元素。另外,请注意 main 函数中没有指针。这就是我们对课堂的期望。

Stack_element 确实是一个结构,因为将 Stack_element 本身封装起来并没有多大意义,它只是 Stack 的一个实现细节。

所以这是我的代码来源于你的

#include<iostream>

struct Stack_element{
  int data;
  Stack_element*next;
};   

class Stack{
private:
  Stack_element*last_data, first_data;

public:

  Stack():last_data(NULL), first_data(NULL){}  
  void push(int data);
  void print() const;  
};

void Stack::push(int data)
{
  Stack_element*p=new Stack_element();
  p->data=data;
  p->next=NULL;
  if(last_data)
    last_data->next=p;
  else // empty stack
    first_data=p;
  last_data=p;
}

void Stack::print()
{
  for(Stack_element*p=first_data;p;p=p->next)
    std::cout << p->data << std::endl; // ** Do not use printf in c++. Ever. **
}    

并在主函数中调用

Stack stack;
stack.push(30);
stack.push(40);
stack.print();

备注:对于 C++ 打印,您可能想要ostream& print(ostream& os)改为,其中

std::ostream& Stack::print(std::ostream& os)
{
  for(Stack_element*p=first_data;p;p=p->next)
    os << p->data << std::endl;
  return os;
} 

只是为了能写std::cout << stack.print() << std::endl;。这样做的好处是您可以轻松地重定向到文件。

std::ofstream ofs("yourfile.txt");
ofs << stack.print() << std::endl; // prints to file instead of screen.
于 2012-12-02T23:50:56.120 回答
0

假设这么多工作按计划进行:

StackElement *stack = new StackElement();
stack->data = 20;
stack->Push(30,stack);

现在您的数据看起来像[20]->[30]

现在你尝试

stack->Push(40,stack);

因此,该Push方法创建了一个新的StackElement,赋予其值 40,并设置Stack为指向它: [20]->[40]。请注意[30]已丢失。

然后是Print函数:

while(element->next != NULL){       
  printf("%d\n",element->data);       
  element = element->next;    
}

如果只有一个元素(其next为 NULL),则此函数将退出并且不打印任何内容。如果有两个,这个函数会打印第一个的数据,然后退出。只要Push有那个错误,就永远不会超过两个。

于 2012-12-02T23:56:37.903 回答