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

时间:2012-12-02 23:37:24

标签: 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;    
    }

}

2 个答案:

答案 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有错误,就永远不会超过两个。