0

我是这个网站的新手,我会尽我所能做出贡献。另外,请知道我从来没有在不花很多时间自己弄清楚的情况下提出问题。

因此,C++ 堆栈让我发疯。

我的问题:我应该将我的变量/值放在 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;
    }
};

[ETC....]

这是基本的千篇一律....假设我正在尝试对其进行调整以表达一个系统,其中最后的食品订单首先被踢出;变量是“食物”、“订单”等等。我在哪里将这些变量集成到上面的堆栈代码中!?!??!

请帮助我很困惑我要不分青红皂白地打东西

4

6 回答 6

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;
于 2012-04-29T23:18:10.610 回答
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/...
};
于 2012-04-29T23:26:11.503 回答
1

这一切都在top变量中。此变量指示哪个对象是当前顶部。当您 时pop()top变量会减少——这意味着顶部现在比原来的位置低一个。当 you 时push(),它会增加 - 顶部现在比原来的位置高一倍。这个变量解释了堆栈的 LIFO 功能。

当然,您可以template使用该类使其与 aFoodOrder或其他任何东西一起使用。

于 2012-04-29T23:38:59.577 回答
1

我不明白为什么会出现混乱。数据将进入,呃!,“数据”变量。

因此,您要么使用模板,使数据缓冲区能够容纳任何东西,要么将数据类型更改为您特别需要的类型。

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

FoodOrder *data[MAX_SIZE];

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

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

PS 2 海报写道:“我是这个网站的新手,我会尽我所能做出贡献。”。真的吗?那么他为什么还没有选择一个答案呢?这闻起来更像是家庭作业吗?

于 2012-04-30T00:41:34.713 回答
1

数据的类型,以及 Top 和 Pop 返回的数据类型,以及 Push 作为参数的数据类型,就是堆栈中包含的内容;这就是您要替换的任何类型的东西,无论您想把它变成一堆。

于 2012-04-29T23:11:43.867 回答
1

这是一个堆栈:

堆

这样想:在不移动其他书的情况下添加一本书的唯一方法是将其放在顶部:这就是这样Push做的。因此,通过调用Push(Book1),您会将 Book1 放在堆的顶部。

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

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

于 2012-04-29T23:15:55.690 回答