困惑于C ++堆栈使用

时间:2012-04-29 23:08:23

标签: c++ nodes stack

我是这个网站的新手,并会尝试尽我所能做出贡献。此外,请知道我没有花太多时间试图弄明白我自己也不会问一个问题。

因此,C ++ Stacks让我疯狂。

我的问题:我在哪里将变量/值放在Stack功能块中以实际使用它。我理解Stacks是一个LIFO数据结构,我已经阅读了无数堆叠板的例子,等等。

查看此代码:

#include <iostream>
using namespace std;

const int MAX_SIZE = 100;

class StackOverFlowException 
{
    public:
        StackOverFlowException() 
        {
            cout << "Stack overflow" << endl;
        }
};

class StackUnderFlowException 
{
    public:
        StackUnderFlowException() 
        {
            cout << "Stack underflow" << endl;
        }
};

class ArrayStack 
{    
    private:        
        int data[MAX_SIZE];        
        int top;    
  public:        
      ArrayStack() 
      {            
          top = -1;        
    }        

    void Push(int element)
    {            
        if ( top >= MAX_SIZE ) 
            {            
                throw new StackOverFlowException();
            }                   
            data[++top] = element;        
    }        

    int Pop()
    {            
        if ( top == -1 ) 
            {            
                throw new StackUnderFlowException();            
            }            
            return data[top--];        
    }        

    int Top() 
    {            
        return data[top];        
    }

    int Size() 
    {
        return top + 1;
    }

    bool isEmpty() 
    {
        return ( top == -1 ) ? true : false;
    }
};

[等等...

这是基本的千篇一律.... 让我说我正在尝试调整它以表达一个系统,其中放置最后的食物订单,首先被踢出;变量是“食物”,“订单”等等。 我在世界的哪个地方将这些变量集成到上面的堆栈代码中!?!??!

请帮助我如此困惑,我将不分青红皂白地打一些东西

6 个答案:

答案 0 :(得分:4)

堆栈实现可以使用模板,以便您可以在堆栈中放置任何您想要的内容(在合理范围内)。

例如,有一个类封装了与订单相关的所有数据(这只是一个例子):

class FoodOrder
{
    int orderNumber;
    time_t orderTime;

    // add more variables here
}

然后,您的堆栈可能如下所示:

template<typename T> class Stack
{
    T data[MAX_SIZE];
    int top;

    void Push(T item);
    T Pop(void);

    // add methods
}

然后,您可以拥有Stack所需的任何项目:

Stack<int> stackOfInts;
Stack<std::string> stackOfStrings;
Stack<FoodOrder> stackOfOrders;

答案 1 :(得分:2)

使用现有的std::stack并将其包装起来,如果你想要例外,例如像这样(注意你可以轻易地模板化它):

class protectedstack
{
private:
    std::stack<int> stack;
    const int myarbitraryupperlimit = 100;
public:
    void pop() 
    {
        if(stack.empty()) 
        {
            throw new StackUnderFlowException();            
        }
        stack.pop();
    }
    void push(const int& value)
    {
        if(stack.size()>=myarbitraryupperlimit)
        {
            throw new StackOverFlowException();
        }
        stack.push(value);
    }
    // Similar for top/empty/constructors/...
};

答案 2 :(得分:1)

数据的类型,以及Top&amp;的数据类型Pop返回以及Push作为参数的内容是堆栈中包含的内容;这就是你要用什么类型替换你想要的东西。

答案 3 :(得分:1)

这是一个堆栈:

stack

以这种方式思考:添加书籍而不移动其他书籍的唯一方法是将其放在首位:这就是Push所做的。因此,通过致电Push(Book1),您可以将Book1置于最重要的位置。

同样地,在不移动其他书籍的情况下拿走一本书的唯一方法就是把它放在最前面:这就是Pop所做的。因此,通过调用Pop(),您将获得(并从堆栈中移除)堆栈顶部的任何书籍,图像中的书籍是绿皮书。

我错过了什么或这是你的问题吗?

答案 4 :(得分:1)

全部在top变量中。此变量指示哪个对象是当前顶部。当您pop()时,top变量会减少 - 意味着顶部现在低于它所在的位置。当你push()时,它会增加 - 顶部现在高于它的位置。这个变量是堆栈LIFO功能的原因。

当然,您可以template使用FoodOrder或其他任何内容来使用它。

答案 5 :(得分:1)

我不明白为什么混乱。数据将输入,duh!,“数据”变量。

因此,您可以使用模板,使数据缓冲区能够容纳任何内容,或者将数据类型更改为您特别需要的数据。

例如,如果您有一个FoodOrder类,您可以这样做(我的C ++生锈了,但这基本上是它的要点):

FoodOrder * data [MAX_SIZE];

您必须更改push / pop参数以相应地接受FoodOrder指针/引用,然后进行设置。

P.S。关于使用std :: stack - 这可能是一个更好的解决方案,但没有回答他的具体问题。

P.S 2 Poster写道:“我是这个网站的新手,并会尝试尽我所能做出贡献。”真?那为什么他甚至没有选择答案呢?这有点像家庭作业吗?