C++堆栈数据结构.这段代码有什么问题?

pkl*_*luz 1 c++ stack data-structures

所以我目前正在尝试通过实现各种数据结构将我的Java体验迁移到C++,以便至少实现一次.

你介意给我一些建议吗?我遇到的问题主要集中在push(int值)中的指针,尤其是pop().由于推动似乎正常工作,我发现自己很难在弹出东西时获得正确的价值.怎么了?

PS:我也认为,既然我手动分配了我的数组空间,我也需要删除它.我怎么做?

#ifndef STACK_H
#define STACK_H

class Stack
{
private:
    int *stackArray;
    int elementsInArray;
    int allocatedArraySize;
    int alpha;
    int beta;

public:
    Stack();
    void push(int aValue);
    int pop();
    bool isEmpty();
    int size() const;
};

#endif
Run Code Online (Sandbox Code Playgroud)

和实施:

#include <iostream>
#include "Stack.h"

Stack::Stack() 
{
    alpha = 4;
    beta = 2;
    elementsInArray = 0;
    allocatedArraySize = 1;
    stackArray = new int[1];
}

void Stack::push(int aValue)
{
    if (elementsInArray == allocatedArraySize) 
    {
        int temporaryArray[allocatedArraySize*beta];

        for (int i = 0; i < elementsInArray; i++)
            temporaryArray[i] = stackArray[i];

        stackArray = temporaryArray;
        allocatedArraySize *= beta;
    }

    elementsInArray++;
    stackArray[elementsInArray] = aValue;
}

int Stack::pop()
{
    int result = -INT_MAX;

    if (elementsInArray == 0)
        return result;

    if (elementsInArray > 0) 
    {
        result = stackArray[elementsInArray-1];
        elementsInArray--;

        if (elementsInArray <= allocatedArraySize/alpha) 
        {
            int temporaryArray[allocatedArraySize/alpha];

            for (int i = 0; i < elementsInArray; i++) 
                temporaryArray[i] = stackArray[i];

            stackArray = temporaryArray;
            allocatedArraySize /= beta;
        }
    }

    return result;
}

bool Stack::isEmpty()
{
    if (elementsInArray == 0) 
        return true;

    return false;
}

int Stack::size() const
{
    return allocatedArraySize;
}
Run Code Online (Sandbox Code Playgroud)

Gre*_*ius 5

对于初学者,你应该在数组上增加索引,所以改变:

elementsInArray++;
stackArray[elementsInArray] = aValue;
Run Code Online (Sandbox Code Playgroud)

至:

stackArray[elementsInArray++] = aValue;
Run Code Online (Sandbox Code Playgroud)

要么:

stackArray[elementsInArray] = aValue;
elementsInArray++;
Run Code Online (Sandbox Code Playgroud)

其次,当您创建新的临时数组时,您在if语句中执行它...因此它是一个局部变量并放在系统堆栈上并在退出if语句后丢失.所以改变

int temporaryArray[allocatedArraySize*beta];
Run Code Online (Sandbox Code Playgroud)

至:

int *temporaryArray = new int[allocatedArraySize*beta];
Run Code Online (Sandbox Code Playgroud)

第三,在复制tempArray的位置之前,通过从stackArray保存原始指针添加你正在讨论的删除,然后在完成指针复制后执行删除.

最后,您必须对弹出功能进行类似的更改......