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

时间:2013-12-04 21:54:58

标签: c++ list stack push pop

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

我们必须使用StackElement

的定义
struct StackElement {
int digit;
StackElement* predecessor;
};

现在的问题是如何在没有下一个参数的情况下创建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,它可以作为一个伪&#39; -StackElement,并始终保持在最顶层,以便真正的&#39;顶部的元素永远是伪元素的前身 - 但我们认为这将反对堆栈应该如何工作。

那么你们有什么线索可以继续吗?有什么东西我们只是缺少? 我们非常感谢您提供的任何帮助。

提前致谢, Chrissik(&amp; team)

4 个答案:

答案 0 :(得分:3)

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

第二)堆栈应为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

答案 1 :(得分: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;
}

希望这有帮助。

编辑:我将为完整性添加pop函数:

void Stack::pop()
{
  if (last_data)
  {
    StackElement *tp = last_data;
    last_data = last_data->predecessor;
    delete tp;
  }
}

答案 2 :(得分:0)

如果堆栈已满并且我们尝试在其中放入一些东西,那么它将给我们堆栈溢出的错误

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

答案 3 :(得分:-2)

#include <iostream>

using namespace std;

static int arr[4], top = -1;

//Push function
void push() {

    if (top > 3)
        cout << "stack overflow ";
    else {
        top++;
        cout << "Enter element to insert : ";
        cin >> arr[top];
    }
}

//pop function
void pop() {
    if (top == -1) {
        cout << "Stack underflow ";
    } else
        top--;
}

//pip function print top variable
void pip() {
    if (top == -1) {
        cout << "Stack underflow ";
    } else
        cout << "Top variable :" << arr[top];
}

//main() function    
int main() {
    int choice;
l1:
    cout << "Enter choice : \n 0:push 1:pip 2:pop ";
    cin >> choice;
    switch (choice) {
    case 0:
        push();
        break;

    case 1:
        pip();
        break;

    case 2:
        pop();
        break;

    }
    goto l1;

}