C++堆栈推送/打印实现
C++ Stack Push/Print 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: %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
有那个错误。
相关文章:
- 如何循环打印顶点结构
- 如果没有malloc,链表实现将失败
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 为自定义打印调试实现传递任何类型的变量
- 使用 Boost HOF 实现 STL 漂亮打印
- 如何实现否定用户输入退出程序和打印列表?
- C++二叉树打印函数实现
- 在C++中实现二叉搜索树,搜索不起作用.尝试打印节点的元素会导致输出崩溃
- 打印出使用地图实现的Trie中的所有单词
- 实现链接方法时打印的值错误
- 如何实现打印功能
- C++堆栈推送/打印实现
- 如何在C++中打印出以下实现的链接列表
- 如何在实现BFS的同时打印节点的前身
- 链接列表的添加、删除和打印实现
- 如何:在打印函数中实现多态性
- 很难实现限制每行打印多少个整数
- 在c++中实现一个以空格分隔的方式打印参数的函数