对于栈的操作,这样对么?
struct IOStack{
//栈的结构体定义
std::string *base;//底部指针
std::string *top;//顶部指针
int StackSize;//栈容量
};
void InitStack(IOStack *s, int a)
{
//初始化栈
s->base = new std::string; //申请空间
if (!((s->base) == 0))
{
return;
}
s->top = s->base;//顶底同址
s->StackSize = a;//栈大小
}
void Push(IOStack *s, std::string *e)
{
//入栈操作
*(s->top) = *e;
(s->top)++;
if ((s->top) >= (s->base + s->StackSize))//如果空间不够了,就需要重新申请更大的空间
{
IOStack ss; //申请一个新的栈结构
InitStack(&ss, 2 * (s->StackSize)); //调用栈的初始化函数
for (int i = 0; i < s->StackSize; i++) //将原来栈中的值依次赋值给新的栈
{
*(ss.base + i) = *(s->base + i);
}
delete[](s->base); //注意,我在这里将原来的栈删除了
s->base = ss.base; //请问:我这里的操作对么?还能不能将SS的地址赋值给S->base?
s->top = s->base + s->StackSize;
s->StackSize = 2 * s->StackSize;
}
} 可以的,你这里只是把s->base指向的内存释放掉了,s->base任然是一个指针还是可以使用的。只不过程序中有一个问题if ((s->top) >= (s->base + s->StackSize))这个地方该改为if ((s->top) >= (s->base + s->StackSize*sizeof(IOStack *))),而且不建议使用指针来做比较操作,指针最好只用来取值。栈结构体修改一下,增加一个容量来只是是否需要开辟新的占空间。 额,我试了下,我源代码可以使用的。
倒是你建议的那个地方,是你理解错了,栈不是数据节点,不需要乘以栈的大小的。 虽然不知道这个程序是要做什么,但是delete了的指针,请一定要赋值为NULL,不要再使用。 花落、季 发表于 2016-6-5 22:38
虽然不知道这个程序是要做什么,但是delete了的指针,请一定要赋值为NULL,不要再使用。
我delete的不是指针,是指针指向的动态内存空间。你看我后面把这个指针又指向了其他地方。所以这个程序应该没有风险的。
至于这个程序的目的,是为了让栈空间在装满了以后自动扩容为原来的一倍大小。这样在初始化栈的时候就不会浪费内存。
页:
[1]