如何在堆栈中分离正数和负数?

时间:2014-05-06 03:54:24

标签: c xcode stack partition

所以我应该在c中使用一个方法来移动堆栈中的所有负数。我这样做的计划是将底片和正片分成两个不同的堆栈,然后将它们合并。

#include <stdio.h>
#include <stdlib.h>

#define SIZEMAX 10

typedef struct node
   {
   int data;
   struct node* next;
   }node;

typedef struct stack
    {
    node *head;
    int stksize;
    }stack;

void initialize(stack *stk)
   {
   stk->head=NULL;
   stk->stksize=0;
   }

void push(stack *stk,int x)
   {
   if (stk->stksize==SIZEMAX)
      {  
      printf("stack full");
      return;
      }

   node *temp=(node*)malloc(sizeof(node));
   temp->data=x;
   temp->next=stk->head;
   stk->head=temp;
   stk->stksize++;
   }

void print(stack *stk)
   {
   node *temp=stk->head;
   while(temp!=NULL)
      {
      printf("|%d|\n",temp->data);
      temp=temp->next;
      }
   }

void pop(stack *stk)
   {
   node *temp=(node*)malloc(sizeof(node));
   if (stk->stksize==0)
      {
      printf("nothing to pop");
      return;
      }

   temp->data=stk->head->data;
   temp=stk->head->next;
   stk->head=temp;
   free(temp);
   stk->stksize--;
   }

void partition(stack *stk)
   {
   stack negative,positive;

   initialize(&negative);
   initialize(&positive);
   while (stk->stksize!=0)
      {
      if (stk->head->data<0)
         {   
         push(&negative,stk->head->data);
         pop(stk);
         }
      if (stk->head->data>0)
         {
         push(&positive,stk->head->data);
         pop(stk);
         }
      }
   }

int main()
   {
   int i,x;
   stack mystk;
   initialize(&mystk);

   for(i=0;i<5;i++)
      {
      scanf("%d",&x);
      push(&mystk,x);
      }

   print(&mystk);
   partition(&mystk);
   printf("\n");
   print(&mystk);

   return(0);
   } 

在主要调用分区函数之后,我什么也得不到,因为堆栈中的所有内容都被弹出,但我得到了永远不会结束的数字链。我无法弄清楚问题。

1 个答案:

答案 0 :(得分:0)

您的问题在于pop()功能。它应该看起来像

void pop(stack *stk)
{
   if (stk->stksize==0)
   {
      printf("nothing to pop");
      return;
   }

   node *temp=stk->head->next;
   free(stk->head);
   stk->head = temp;
   stk->stksize--;
}

Live demo

并且不要忘记处理partition()函数中的0。