Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于C++堆栈使用的困惑_C++_Nodes_Stack - Fatal编程技术网

关于C++堆栈使用的困惑

关于C++堆栈使用的困惑,c++,nodes,stack,C++,Nodes,Stack,我是这个网站的新手,我会尽我所能的贡献。另外,请知道,我问问题的时候总是花很多时间自己想办法 这样,C++堆栈会让我疯狂。 我的问题是:我应该把变量/值放在堆栈函数块的什么位置来实际使用它。我知道堆栈是一种后进先出的数据结构,我读过无数的例子,层叠在一起,等等 请看以下代码: [等等……] 这是一个基本的曲奇饼切割器……比方说,我正在尝试将它改编成一个系统,在这个系统中,最后一次下的食品订单,首先被淘汰;变量是“食物”、“订单”和其他任何东西。 我究竟在哪里将这些变量集成到上面的堆栈代码中 请帮

我是这个网站的新手,我会尽我所能的贡献。另外,请知道,我问问题的时候总是花很多时间自己想办法

这样,C++堆栈会让我疯狂。

我的问题是:我应该把变量/值放在堆栈函数块的什么位置来实际使用它。我知道堆栈是一种后进先出的数据结构,我读过无数的例子,层叠在一起,等等

请看以下代码:

[等等……]

这是一个基本的曲奇饼切割器……比方说,我正在尝试将它改编成一个系统,在这个系统中,最后一次下的食品订单,首先被淘汰;变量是“食物”、“订单”和其他任何东西。 我究竟在哪里将这些变量集成到上面的堆栈代码中


请帮我解释一下,我将不分青红皂白地打孔一些东西。堆栈中包含的数据类型,以及Top&Pop返回的数据类型,以及Push作为参数的数据类型;这就是你要替换的东西,你想把它做成一个堆栈的任何东西的类型。

这是一个堆栈:

这样想:添加一本书而不移动其他书的唯一方法是将它放在上面:这就是推的作用。因此,通过调用PushBook1,您将把Book1放在堆的顶部

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


我是否遗漏了什么,或者这是您的问题?

堆栈实现可以使用模板,这样您就可以在合理的范围内将任何需要的内容放入堆栈中

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

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
}
如果需要异常,请使用现有的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/...
};
它都在顶部变量中。此变量指示哪个对象是当前顶部。当您弹出时,top变量将减少,这意味着top现在比原来的位置低一个。当你推的时候,它会增加-顶部现在比原来的位置高一个。此变量说明了堆栈的后进先出功能


当然,您可以对类进行模板化,使其与FoodOrder或其他任何工具一起工作。

我不明白为什么会出现混淆。数据会被输入的,嗯!,数据变量

所以,您要么使用模板,使数据缓冲区能够容纳任何内容,要么将数据类型更改为您特别需要的类型

如果你有一个FooOrk类,你可以这样做,我的C++是生锈的,但这基本上是要点:

FoodOrder*数据[最大尺寸]

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

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


p.S.2海报上写道:我是这个网站的新手,我会尽我所能的贡献。。真正地那他为什么还没找到答案呢?这更像是一个家庭作业吗?

那将是一家糟糕的餐厅。基本上,你想把订单推到堆栈上,然后弹出。第一个点菜的人会永远等待……那么std::stack呢?如果你真的想要上流/下流,只需将其包装并在pop/push处添加一个计数器,根本不需要重新设计轮子。@KilianDS:说到轮子,std::stack有它自己的计数器大小,更不用说如果你将容器传递给构造函数会发生什么……只有当前堆栈索引在顶部。他询问的实际数据/值在数据数组中。他已经把最上面的东西钉好了。@MooingDuck:那么应该这样指定
Stack<int> stackOfInts;
Stack<std::string> stackOfStrings;
Stack<FoodOrder> stackOfOrders;
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/...
};