C++堆栈推送/打印实现

C++ Stack Push/Print Implementation

本文关键字:打印 实现 堆栈 C++      更新时间:2023-10-16

我正在尝试用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: %dn", newElement->data);       
    oldElement->next = newElement;       
}

void StackElement::Print(StackElement *element){
    while(element->next != NULL){       
        printf("%dn",element->data);       
        element = element->next;    
    }
}

正如@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.

假设这么多按计划工作:

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("%dn",element->data);       
  element = element->next;    
}

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