我正在尝试用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;
}
}
答案 0 :(得分:2)
你的代码不断丢失先前推送的元素,泄漏内存,正如@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. **
}
并在main函数中调用
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.
答案 1 :(得分:1)
假设这很多按计划运作:
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
有错误,就永远不会超过两个。