使用Push、Pop等在C++中创建堆栈

Create Stack in C++ with Push, Pop etc

本文关键字:创建 堆栈 C++ 等在 Push Pop 使用      更新时间:2023-10-16

我们正在尝试创建一个像堆栈一样工作的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;
   }
}