无限大小使用指向数组的指针的堆栈实现

时间:2016-09-26 16:47:34

标签: c++ data-structures stack

我一直在尝试使用指向任何int的指针来创建一个无限大小的堆栈:

//in class:
int* stack;

//In constructor:
stack = new int();

//In deconstructor:
delete stack;

//In Push:
stack(++top) = element;

这个声明是否正确?我可以使用它来制作无限大小的堆栈吗?当我尝试使用这样的指针声明将元素放入堆栈时,我遇到了错误。

2 个答案:

答案 0 :(得分:3)

您似乎在用C ++编写代码?如果不是,请忽略我的帖子(脸掌)。

首先,可以分配给程序的内存是有限的,即没有无限大小的堆栈。在C ++中,有BSS,Stack和Heap内存。在您的情况下,您使用new运算符来分配内存。事实上,这实际上意味着您希望在堆中获取一块内存来存储您的值。尽管堆的大小可以动态扩展,但它的内存大小仍然不是无限的。

此外,您似乎要在构造函数中执行的操作是构建一个具有无限大小的int数组。实际上,要声明一个数组,您可以编写new int[arraySize]来声明堆中的大小为arraySize的int数组。但是,你在这里写的是在堆中分配一个int,因为你使用的括号不是方形,而是圆形。不幸的是,要创建一个数组,首先需要声明它的大小(更多细节,您可以搜索堆栈数组和动态数组)。为了摆脱大小问题,您可以使用其他数据结构,如std::vector等等。

int* stack;
stack = new int();

这两个语句的指针指向存储在堆内存中的单个int。因此,目前,您所做的堆栈似乎只能存储一个int。

对于push函数,top是堆栈中top int的索引?

还有一件事,如果你要做的是创建一个指向int数组的指针,并将该数组用作堆栈。然后,您可以考虑添加内存的方法,并将解构器修改为:

delete[] stack;

如果您发现上述段落有困难,并且有兴趣了解更多信息,也许您可​​能首先了解堆栈&堆,然后,数组声明以及它与内存分配的关系,然后是关于指针的知识。

我是新手。希望我的回答没有任何错误。

答案 1 :(得分:1)

首先new int ()只创建一个int而不是整数数组,因此您无法执行stack(++top) = element;之类的操作。

如果要创建动态数组,则应使用int* stack = new int[size]并使用delete [] stack将其删除。正如您所看到的,数组的大小有限size但您可以在它变满时调整大小。没有内置的方法来调整数组的大小,但是您可以创建一个更大的新动态数组,并将旧数组复制到其中,然后删除旧数组。但是由于你的记忆力有限,筹码再次无法获得无限大。如果分配失败,将抛出异常。

下面是基于动态数组的堆栈的简单实现。

#include <stdexcept>
using namespace std;

class Stack{

public:
    Stack (int _size = 20){
        size = _size;
        topIndex = 0;
        stack = new int [size];
    }

    ~Stack (){
        delete [] stack;
    }


    void resize(){
        int new_size = size*2;
        int * new_stack;
//        try{
        new_stack = new int[new_size];
//        } catch (std::bad_alloc&) {
            // unsuccessful allocation
//        }
        for ( int i=0; i<size; ++i ){
            new_stack[i] = stack[i];
        }
        delete [] stack;
        stack = new_stack;
        size = new_size;
    }


    void push(int element){
        if (topIndex + 1 == size){            
            resize();
        }
        stack[topIndex++] = element;
    }

    int top(){
        if ( topIndex <= 0 ){
            throw std::out_of_range("stack is empty");
        } else {
            return stack[topIndex-1];
        }
    }

    void pop(){
        if ( topIndex <= 0 ){
            throw std::out_of_range("stack is empty");
        } else {
            --topIndex;
        }
    }

private:    
    int * stack;
    int size;
    int topIndex;
};

int main(){
    Stack stk;
    for ( int i=0;i<50;++i ){
        stk.push(i);
        cout << stk.top() << endl;
    }
    for ( int i=0;i<50;++i ){
        stk.pop();
        cout << stk.top() << endl;
    }
}

请注意,这仅仅是为了练习而且上述实现容易出错。在实际情况中,您几乎应该始终使用内置数据结构。