经典人物 发表于 2016-5-24 21:48:14

对于栈的操作,这样对么?

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;
        }
}

荒年 发表于 2016-5-26 09:29:22

可以的,你这里只是把s->base指向的内存释放掉了,s->base任然是一个指针还是可以使用的。只不过程序中有一个问题if ((s->top) >= (s->base + s->StackSize))这个地方该改为if ((s->top) >= (s->base + s->StackSize*sizeof(IOStack *))),而且不建议使用指针来做比较操作,指针最好只用来取值。栈结构体修改一下,增加一个容量来只是是否需要开辟新的占空间。

经典人物 发表于 2016-6-5 18:34:17

额,我试了下,我源代码可以使用的。
倒是你建议的那个地方,是你理解错了,栈不是数据节点,不需要乘以栈的大小的。

花落、季 发表于 2016-6-5 22:38:19

虽然不知道这个程序是要做什么,但是delete了的指针,请一定要赋值为NULL,不要再使用。

经典人物 发表于 2016-6-16 21:55:39

花落、季 发表于 2016-6-5 22:38
虽然不知道这个程序是要做什么,但是delete了的指针,请一定要赋值为NULL,不要再使用。

我delete的不是指针,是指针指向的动态内存空间。你看我后面把这个指针又指向了其他地方。所以这个程序应该没有风险的。
至于这个程序的目的,是为了让栈空间在装满了以后自动扩容为原来的一倍大小。这样在初始化栈的时候就不会浪费内存。
页: [1]
查看完整版本: 对于栈的操作,这样对么?