鱼C论坛

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

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

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

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

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

x
  1. struct IOStack
  2. {
  3.         //栈的结构体定义
  4.         std::string *base;  //底部指针
  5.         std::string *top;  //顶部指针
  6.         int StackSize;  //栈容量
  7. };

  8. void InitStack(IOStack *s, int a)
  9. {
  10.         //初始化栈
  11.         s->base = new std::string[a];   //申请空间
  12.         if (!((s->base) == 0))
  13.         {
  14.                 return;
  15.         }
  16.         s->top = s->base;  //顶底同址
  17.         s->StackSize = a;  //栈大小
  18. }

  19. void Push(IOStack *s, std::string *e)
  20. {
  21.         //入栈操作
  22.         *(s->top) = *e;
  23.         (s->top)++;
  24.         if ((s->top) >= (s->base + s->StackSize))  //如果空间不够了,就需要重新申请更大的空间
  25.         {
  26.                 IOStack ss;                                           //申请一个新的栈结构
  27.                 InitStack(&ss, 2 * (s->StackSize));       //调用栈的初始化函数
  28.                 for (int i = 0; i < s->StackSize; i++)    //将原来栈中的值依次赋值给新的栈
  29.                 {
  30.                         *(ss.base + i) = *(s->base + i);   
  31.                 }
  32.                 delete[](s->base);                                [size=6]//注意,我在这里将原来的栈删除了[/size]
  33.                 s->base = ss.base;                               [size=6]//请问:我这里的操作对么?还能不能将SS的地址赋值给S->base?[/size]
  34.                 s->top = s->base + s->StackSize;      
  35.                 s->StackSize = 2 * s->StackSize;
  36.         }
  37. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-5-26 09:29:22 | 显示全部楼层
可以的,你这里只是把s->base指向的内存释放掉了,s->base任然是一个指针还是可以使用的。只不过程序中有一个问题
  1. if ((s->top) >= (s->base + s->StackSize))
复制代码
这个地方该改为
  1. if ((s->top) >= (s->base + s->StackSize*sizeof(IOStack *)))
复制代码
,而且不建议使用指针来做比较操作,指针最好只用来取值。栈结构体修改一下,增加一个容量来只是是否需要开辟新的占空间。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-13 13:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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