使用Push、Pop等在C++中创建堆栈
Create Stack in C++ with Push, Pop etc
我们正在尝试创建一个像堆栈一样工作的C++程序。给出了以下说明:应该有几种方法:
我们必须使用StackElement
:的定义
struct StackElement {
int digit;
StackElement* predecessor;
};
现在的问题是如何在没有下一个参数的情况下创建push
-函数,就像普通列表一样。pop函数也是如此。我们完成了让push()
创建一个新的StackElement,pop()
删除新的Element,但有了两个新元素,这些方法就不能正常工作了。
全局参数stack0
:
StackElement *stack0 = new StackElement;
这是push
-功能的代码:
StackElement push(int z){
StackElement *stack1 = new StackElement;
stack1->digit = z;
stack1->predecessor = NULL;
stack0->predecessor = stack1;
stack1 = stack0;
这是pop()
方法:
void pop(){
StackElement *stack1 = new StackElement;
if (stack0!=NULL){
stack1->digit = 0;
stack0->predecessor = NULL; //predecessor = NULL;
}
}
最后是main
方法:
int main()
{
int z;
create();
cout << "Which number to the stack?" << endl;
cin >> z;
push(z);
pop();
print();
return 0;
}
我们曾考虑创建一个新的StackElement,它将作为"伪"StackElement工作,并始终位于顶部,这样顶部的"真实"元素将始终是伪元素的前身,但我们认为这将违背堆栈的工作方式。
你们有什么线索可以继续吗?有什么东西我们只是缺少?
1st)为什么不使用std::stack?
2)堆栈应为后进先出法。这意味着你的stack0应该始终是最新的。。。这导致:
StackElement* stack0 = NULL; // until C++11
// StackElement* stack0 = nullptr; // since C++11
void push(int z) {
StackElement *stack1 = new StackElement;
stack1->digit = z;
stack1->predecessor = stack0;
stack0 = stack1;
}
void pop() {
if(stack0) {
StackElement *tmp = stack0;
stack0 = stack0->predecessor;
delete tmp;
}
}
您不需要在pop函数中分配一个新的。这将导致巨大的内存泄漏。
你所说的pseudo被称为根元素,有时用于序列中。但这里没有必要,因为stack0是根,或者在本例中是结束(第一个元素和结束)。
一个更好的方法是将其封装在一个类中,正如ryrich在回答中提到的那样。最好的方法是使用C++给定的std::堆栈。
你在这里走对了。为了跟踪你的元素,你需要一个类。类似于:
class Stack{
private:
StackElement *last_data, *first_data;
public:
Stack():last_data(NULL), first_data(NULL){}
void push(int digit);
void pop();
};
具有Stack
类的推送/弹出功能部分。例如,推送:
void Stack::push(int digit)
{
StackElement *p=new StackElement();
p->digit = digit;
if(last_data)
p->predecessor=last_data;
else // empty stack
{
p->predecessor=NULL;
first_data = p;
}
last_data=p;
}
希望这能有所帮助。
编辑:为了完整起见,我将添加弹出功能:
void Stack::pop()
{
if (last_data)
{
StackElement *tp = last_data;
last_data = last_data->predecessor;
delete tp;
}
}
如果堆栈已满,我们试图在其中放入一些东西,那么它将给我们堆栈溢出的错误
void IntStack::push()
{
clrscr();
int num;
if(top>=stackSize)
cout<<"stack Overflow"<<endl;
else
{
cout<<"Enter Number=";
cin>>num;
top++;
stackArray[top]=num;
}
}
相关文章:
- 在堆栈上创建类实例
- 如何在C++中为堆栈动态创建结构?
- 为什么在堆栈和堆上创建变量会产生相同的程序集代码?
- 作为指针注入类后重新创建堆栈对象不好吗?
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 无法在具有常量变量大小的类中创建堆栈分配数组
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- 堆还是堆栈用于创建对象?
- 在堆或堆栈上分配的动态创建的字符串 - C
- 使用在堆栈上创建的对象调用虚拟函数
- 如何以编程方式区分在内存的堆和堆栈部分创建的对象
- 创建堆栈时出现问题!(街机游戏)
- 有什么方法可以检测我的类的对象是否在堆栈上创建
- 创建自己的owner_ptr类;在传递堆栈或静态分配的地址时如何避免UB?
- 受保护的析构函数禁用在堆栈上创建派生类的对象?
- 当外部源代码中发生异常时,无法正确使用自创建的小型转储文件的堆栈跟踪
- 创建堆栈VM时的分割故障
- 使用Push、Pop等在C++中创建堆栈
- 为什么无法创建堆栈大小小于默认大小的线程
- 二进制搜索树创建堆栈-overfow