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

Infinite size Stack implementation using pointer to an array

本文关键字:实现 无限大 堆栈 指针 数组      更新时间:2023-10-16

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

//in class:
int* stack;
//In constructor:
stack = new int();
//In deconstructor:
delete stack;
//In Push:
stack(++top) = element;

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

看起来你是在用c++写代码?如果没有,请忽略我的帖子(脸掌)。

首先,可以分配给程序的内存是有限的,即没有无限大小的堆栈。在c++中,有BSS、堆栈和堆内存。在您的例子中,您使用了new运算符来分配内存。实际上,这实际上意味着您希望在堆中获得一块内存来存储您的值。虽然堆的大小可以动态扩展,但它的内存大小仍然不是无限的。

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

int* stack;
stack = new int();

这两个语句都有一个指针指向存储在堆内存中的单个int型。因此,当前,您创建的堆栈似乎只能存储int类型。

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

还有一件事,在这种情况下,你想做的是创建一个指向int数组的指针,并将该数组用作堆栈。然后,您可以考虑增加内存的方法,并将解构器修改为如下所示:

delete[] stack;

如果你觉得理解我上面的段落有困难,并且有兴趣学习更多,也许你可以先学习stack &然后是堆,数组的声明以及它与内存分配的关系,其次是关于指针的知识。

我是一个新手。希望我的答案没有错

首先,new int ()只创建一个int,而不是一个整数数组,因此你不能像stack(++top) = element;那样做。

如果你想创建一个动态数组,你应该使用int* stack = new int[size],用delete [] stack删除它。如您所见,该数组的size大小有限,但您可以在它满时调整它的大小。没有内置的方法来调整数组的大小,但是你可以创建一个更大的新动态数组,并将旧数组复制到其中,然后删除旧数组。但是堆栈不会有无限的大小因为你的内存是有限的。如果分配失败,将抛出异常。

下面是一个基于动态数组的stack的简单实现:

#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;
    }
}

请注意,这只是为了练习,上面的实现很容易出错。在实际情况下,应该使用内置数据结构