请查看以下代码
template <typename T>
class Stack
{
public:
Stack(int number)
{
maxSize = number;
top = -1;
stackData = new T*(maxSize);
}
~Stack()
{
delete [] stackData;
}
int count()
{
}
bool isEmpty()
{
if(top==-1)
{
return true;
}
else
{
return false;
}
}
bool isFull()
{
if(top== (maxSize-1))
{
return true;
}
else
{
return false;
}
}
*T pop()
{
if(!isEmpty())
{
return stackData[top--]; // Remove Item From Stack
}
}
*T peek();
void push(T *pushValue)
{
if(!isFull())
{
stackData[++top] = pushValue;
}
}
private:
int maxSize;
T ** stackData;
int top;
};
在上面的代码中,注释行显示“从堆栈中删除项目”。但实际上,它并没有消除,它只是提供了一个价值落后的价值,对吗?在这里,我将删除称为完全破坏堆栈中的特定值。
ex:在包含数据1,2,3,4的数组中,我删除了'2'。所以现在是1,3,4
其次,“peek()”方法中应该发生什么?
第三,我有没有发现任何错误?
请帮忙!
答案 0 :(得分:2)
他们使用数组作为堆栈。实际上,顶部指向堆栈中的顶部元素。所以当你这样做时:
return stackData[top--];
顶部减少,因此堆栈的大小减少。你真的弹出一个元素。
peek
应该返回堆栈顶部的当前元素 - 弄清楚如何为自己做这件事。
答案 1 :(得分:2)
从概念上讲,递减top
和&#34;删除&#34;之间没有区别。顶级项目。单词&#34;删除&#34;是一个概念抽象来描述堆栈中的顶部项不再是堆栈中的元素的想法。事实上,它并没有在内存中从字面上删除它是无关紧要的。
如果你的意思是你想要&#34;销毁&#34;顶级项目,即调用它的析构函数并释放它,你需要考虑你的Stack
类如何管理内存的更大含义。如果堆栈应该取得每个T
对象的所有权,并且已使用T
分配了每个new
对象,那么您可以拥有pop()
函数{{1}递减delete
之前的顶级项目。 (但是top
无法返回指向已删除元素的指针。)如果堆栈没有取得每个项目的所有权,那么由调用者决定pop()
来管理元素的生命周期/释放。
接下来,pop()
方法只返回指向顶部项目的指针,而不将其从堆栈中删除。
最后,您没有正确分配peek()
指针数组。语法应为:
T*
您发布的代码在stackData = new T*[maxSize];
之后使用括号而不是括号,这不是您想要的。
答案 2 :(得分:0)
1)pop
会弹出一个元素,但它会保留在数组中,直到某些元素被推到它上面。但是你已经改变top
所以堆栈不再“知道”它已经存在了。如果是复杂类型,则不会在pop
上调用析构函数。
2)peek
通常显示堆栈的顶部而不会弹出它。
3)你没有验证构造函数的number
参数。
此外,您可以将isFUll()
简称为{ return (top== (maxSize-1));}
。
答案 3 :(得分:0)
您确定引用正确:
stackData = new T*(maxSize);
不应该是:
stackData = new T*[maxSize];
你是对的,pop方法不会“破坏”数据,它只是将堆栈的顶部移动到下一个位置(从顶部元素到顶部的第二个元素)。我不确定你为什么要“摧毁堆栈中的特定价值”......总的来说,这不会有任何有意义的目的。
此外,你所描述的“删除中间的东西”并不是你通常用堆栈做的事情 - 这是一个列表,deque或类似的东西。
关于编写一个peek函数,它将涉及与pop
几乎相同的步骤,除非你不移动top
......
答案 4 :(得分:0)
这个想法是索引大于top
的每个元素都是无效的,而索引小于top的任何元素都是有效的。通过减少顶部,您将删除一个元素,通过增加顶部,您将添加一个元素。