我正在尝试用 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;
}
}
最佳答案
如@Beta 所述,您的代码不断丢失先前推送的元素,泄漏内存。
我建议将下面的代码与您的代码进行比较。你会看到,我已经将堆栈元素的处理移到外面,只是为了能够跟踪第一个元素。另外,请注意主函数中没有指针。这就是我们对类的期望。
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.
关于C++ 堆栈推送/打印实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13675210/