鱼C论坛

 找回密码
 立即注册
查看: 2509|回复: 4

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

[复制链接]
发表于 2016-5-24 21:48:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
struct IOStack
{
        //栈的结构体定义
        std::string *base;  //底部指针
        std::string *top;  //顶部指针
        int StackSize;  //栈容量
};

void InitStack(IOStack *s, int a)
{
        //初始化栈
        s->base = new std::string[a];   //申请空间
        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;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 *)))
,而且不建议使用指针来做比较操作,指针最好只用来取值。栈结构体修改一下,增加一个容量来只是是否需要开辟新的占空间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-5 18:34:17 | 显示全部楼层
额,我试了下,我源代码可以使用的。
倒是你建议的那个地方,是你理解错了,栈不是数据节点,不需要乘以栈的大小的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-5 22:38:19 | 显示全部楼层
虽然不知道这个程序是要做什么,但是delete了的指针,请一定要赋值为NULL,不要再使用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-16 21:55:39 | 显示全部楼层
花落、季 发表于 2016-6-5 22:38
虽然不知道这个程序是要做什么,但是delete了的指针,请一定要赋值为NULL,不要再使用。

我delete的不是指针,是指针指向的动态内存空间。你看我后面把这个指针又指向了其他地方。所以这个程序应该没有风险的。
至于这个程序的目的,是为了让栈空间在装满了以后自动扩容为原来的一倍大小。这样在初始化栈的时候就不会浪费内存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-16 00:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表