我一直在尝试使用指向任何int的指针来创建一个无限大小的堆栈:
//in class:
int* stack;
//In constructor:
stack = new int();
//In deconstructor:
delete stack;
//In Push:
stack(++top) = element;
这个声明是否正确?我可以使用它来制作无限大小的堆栈吗?当我尝试使用这样的指针声明将元素放入堆栈时,我遇到了错误。
答案 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;
}
}
请注意,这仅仅是为了练习而且上述实现容易出错。在实际情况中,您几乎应该始终使用内置数据结构。