pkl*_*luz 1 c++ stack data-structures
所以我目前正在尝试通过实现各种数据结构将我的Java体验迁移到C++,以便至少实现一次.
你介意给我一些建议吗?我遇到的问题主要集中在push(int值)中的指针,尤其是pop().由于推动似乎正常工作,我发现自己很难在弹出东西时获得正确的价值.怎么了?
PS:我也认为,既然我手动分配了我的数组空间,我也需要删除它.我怎么做?
#ifndef STACK_H
#define STACK_H
class Stack
{
private:
int *stackArray;
int elementsInArray;
int allocatedArraySize;
int alpha;
int beta;
public:
Stack();
void push(int aValue);
int pop();
bool isEmpty();
int size() const;
};
#endif
Run Code Online (Sandbox Code Playgroud)
和实施:
#include <iostream>
#include "Stack.h"
Stack::Stack()
{
alpha = 4;
beta = 2;
elementsInArray = 0;
allocatedArraySize = 1;
stackArray = new int[1];
}
void Stack::push(int aValue)
{
if (elementsInArray == allocatedArraySize)
{
int temporaryArray[allocatedArraySize*beta];
for (int i = 0; i < elementsInArray; i++)
temporaryArray[i] = stackArray[i];
stackArray = temporaryArray;
allocatedArraySize *= beta;
}
elementsInArray++;
stackArray[elementsInArray] = aValue;
}
int Stack::pop()
{
int result = -INT_MAX;
if (elementsInArray == 0)
return result;
if (elementsInArray > 0)
{
result = stackArray[elementsInArray-1];
elementsInArray--;
if (elementsInArray <= allocatedArraySize/alpha)
{
int temporaryArray[allocatedArraySize/alpha];
for (int i = 0; i < elementsInArray; i++)
temporaryArray[i] = stackArray[i];
stackArray = temporaryArray;
allocatedArraySize /= beta;
}
}
return result;
}
bool Stack::isEmpty()
{
if (elementsInArray == 0)
return true;
return false;
}
int Stack::size() const
{
return allocatedArraySize;
}
Run Code Online (Sandbox Code Playgroud)
对于初学者,你应该在数组上增加索引,所以改变:
elementsInArray++;
stackArray[elementsInArray] = aValue;
Run Code Online (Sandbox Code Playgroud)
至:
stackArray[elementsInArray++] = aValue;
Run Code Online (Sandbox Code Playgroud)
要么:
stackArray[elementsInArray] = aValue;
elementsInArray++;
Run Code Online (Sandbox Code Playgroud)
其次,当您创建新的临时数组时,您在if语句中执行它...因此它是一个局部变量并放在系统堆栈上并在退出if语句后丢失.所以改变
int temporaryArray[allocatedArraySize*beta];
Run Code Online (Sandbox Code Playgroud)
至:
int *temporaryArray = new int[allocatedArraySize*beta];
Run Code Online (Sandbox Code Playgroud)
第三,在复制tempArray的位置之前,通过从stackArray保存原始指针添加你正在讨论的删除,然后在完成指针复制后执行删除.
最后,您必须对弹出功能进行类似的更改......