【问题标题】:Create Stack in C++ with Push, Pop etc使用 Push、Pop 等在 C++ 中创建堆栈
【发布时间】:2013-12-21 14:49:44
【问题描述】:

我们正在尝试创建一个像堆栈一样工作的 C++ 程序。 给出以下说明: 应该有几种方法:

我们必须使用StackElement的这个定义:

struct StackElement {
int digit;
StackElement* predecessor;
};

现在的问题是如何在没有 next 参数的情况下创建push-函数,就像普通列表一样。 pop 函数也是如此。 我们完成了让push() 创建一个新的 StackElement 和pop() 删除新的元素,但是有了 2 个新元素,这些方法无法正常工作。

全局参数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 工作,并且始终保持在顶部,这样顶部的“真实”元素将始终是伪元素的前身 - 但我们认为这会违反堆栈的工作方式。

那么你们对如何进行有任何线索吗?有什么我们缺少的吗?

【问题讨论】:

  • 为什么popvoid函数?我希望它返回int...
  • stack1 = stack0; 绝对没有意义。 stack1 是函数中的局部变量。

标签: c++ list stack


【解决方案1】:

你在正确的轨道上。要跟踪您的元素,您需要一个类。比如:

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;
  }
}

【讨论】:

  • 你有几个错误: 1. first_data(NULL) first_data 不是指针。 2.你在后面推,但在前面弹出,这意味着是先进先出,但堆栈通常是先进先出。
  • 不确定你的意思。运行此代码没有问题。
【解决方案2】:

1st) 为什么不使用std::stack

2nd) 堆栈应该是LIFO。这意味着您的 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 函数中分配一个新的。这将导致巨大的内存泄漏。

您所说的伪称为根元素,有时用于序列中。但这里不是必需的,因为 stack0 是根,或者在这种情况下是结尾(第一个元素和结尾)。

更好的方法是将其封装在一个类中,正如 ryrich 在他的回答中提到的那样。最好的方法是使用 C++ 给出的std::stack

【讨论】:

  • 谢谢,这解决了问题就好了。还要感谢“根元素”的解释。
【解决方案3】:

如果堆栈已满,我们尝试往里面放一些东西,那么它会给我们堆栈溢出的错误

void IntStack::push()
{
   clrscr();
   int num;
   if(top>=stackSize)
        cout<<"stack Overflow"<<endl;
   else
   {
    cout<<"Enter Number=";
    cin>>num;
    top++;
      stackArray[top]=num;
   }
}

【讨论】:

    猜你喜欢
    • 2016-08-16
    • 2013-04-20
    • 2021-03-18
    • 1970-01-01
    • 2010-09-30
    • 2011-05-04
    • 1970-01-01
    • 2021-10-14
    • 2023-04-01
    相关资源
    最近更新 更多