使用O(1)find-max / find-min实现堆栈时出错?

时间:2015-03-31 21:45:19

标签: c data-structures stack

我已经为Stack ADT实现了几个函数。我试图在O(1)时间内找到最大值和最小值,并且我已经扩充了我的堆栈结构以实现此目的。这是我的代码:

 void mms_push(MMStack mms, int i) {

struct llnode *new = malloc(sizeof(struct llnode));
new->item = i;
if(mms->len!=0)
{
 new->next = mms->topnode;
 mms->topnode = new;
}
else 
{
 new->next = NULL;
 mms->topnode = new;
}

if (mms->len == 0)
{
mms->topnode->minc = i;
mms->topnode->maxc = i;}
else
{
  if(mms->topnode->maxc < i)
  {
      mms->topnode->maxc = i;
  }

  if(i<mms->topnode->minc)
  {
      mms->topnode->minc = i;
  }


mms->len++;}


int mms_pop(MMStack mms) {
  assert(mms);
  int ret = mms->topnode->item;
  struct llnode *backup = mms->topnode;
  mms->topnode = mms->topnode->next;
  mms->len--;


  free(backup);
  return ret;
}

我使用的结构如下:

struct llnode
{

  int item;
  struct llnode *next;
  int minc;
  int maxc;
};

struct mmstack
{
  int len ;
  struct llnode *topnode;

};


typedef struct mmstack *MMStack;

我没有得到max和min值的正确值。如何更正代码,以便在堆栈中获得正确的max和min元素值?

提前致谢!

2 个答案:

答案 0 :(得分:1)

看看这段代码:

if (mms->len == 0)
{
  mms->topnode->minc = i;
  mms->topnode->maxc = i;
}
else
{
  if(mms->topnode->maxc < i)
  {
      mms->topnode->maxc = i;
  }

  if(i<mms->topnode->minc)
  {
      mms->topnode->minc = i;
  }
}

请注意,在else分支中,您需要在初始化mms->topnode->mincmms->topnode->maxc之前阅读mms->topnode->mincmaxc的值。我认为您需要在重新分配mms->topnode之前查看else { mms->topnode->maxc = mms->topnode->next->maxc; mms->topnode->minc = mms->topnode->next->minc; if(mms->topnode->maxc < i) { mms->topnode->maxc = i; } if(i<mms->topnode->minc) { mms->topnode->minc = i; } } / i的值。要解决此问题,请尝试执行以下操作:

{{1}}

这些额外的两行将最小值和最大值初始化为旧的最大值,然后与{{1}}进行比较,这应该确保它们获得一个值。

希望这有帮助!

答案 1 :(得分:0)

您稍微做了一些事情 - 将i与新的未初始化节点中的值进行比较后,将其插入堆栈中。

首先完全准备新节点然后将其链接到堆栈中会更容易。

假设空堆栈有一个NULL topnode:

void mms_push(MMStack mms, int i) {
   struct llnode *new = malloc(sizeof(struct llnode));
   new->item = i;
   new->next = mms->topnode;
   if (!mms->topnode)
   {
       new->minc = i;
       new->maxc = i;
   }
   else
   {
      new->minc = min(mms->topnode->minc, i);
      new->maxc = max(mms->topnode->maxc, i);
   }
   mms->topnode = new;
   mms->len++;
}

我不确定minmax是否为C99,但它们很容易定义。