使用指向数组的指针实现无限大小的堆栈
Infinite size Stack implementation using pointer to an array
我一直在尝试使用指向任意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;
}
}
请注意,这只是为了练习,上面的实现很容易出错。在实际情况下,应该使用内置数据结构
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- std::random_device是如何实现的