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

标签 c++ printing stack push implementation

我正在尝试用 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/

相关文章:

Python -> 告诉一个带有 print 语句的程序到 "not print"

c - 简单的程序在打开文件时导致段错误

delphi - 有趣的堆栈问题?

java - 使用 Stack 上 Vector 类的 remove(item) 是否会保持 O(1) 弹出、查看、推送运行时间?

c - while循环不起作用?

c++ - std::transform 和 move 语义

c++ - MPI - 将 std::vector<string> 发送到另一组进程

c++ - 为什么这里的枚举变量是右值?

c++ - 从基本矩阵中提取平移和旋转

c# - 如何打印第一页的末尾