棧的順序

[cpp] view plaincopyprint?

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

#define TRUE 1  
#define FALSE 0  
#define ERROR -1  
#define STACKINITSIZE 20  
#define STACKADDSIZE 5  

typedef int ElemType;  
typedef int Status;  
typedef struct   
{  
  ElemType *top;  
  ElemType *base;  
  int stackSize;  
} sqStack;  

Status InitStack(sqStack *s);  
Status PushStack(sqStack *s,ElemType e);  
Status PopStack(sqStack *s,ElemType *e);  
Status ClearStack(sqStack *s);  
Status DestroyStack(sqStack *s);  
int GetStackLen(sqStack *s);  
void my_err(char *s);  

int main(int argc,char *argv[])  
{  
  sqStack s;  
  Status result;  
  result=InitStack(&s);  
  if(result==ERROR)  
    {  
      my_err("InitStack return Error.");  
    }  
  int i;  
  for(i=0;i<47;i++)  
    {  
      result=PushStack(&s,i);  
      if(result==ERROR)  
    {  
      my_err("PushStack return Error.");  
    }  
    }  
  ElemType e;   
  for(i=0;i<40;i++)  
    {  
      result=PopStack(&s,&e);  
      if(result==FALSE)  
    {  
      printf("The stack has no value.\n");  
      break;  
    }  
      if(result==TRUE)  
    {  
      printf("%d,",e);  
    }  
    }  
  printf("\nStack length:%d\n",GetStackLen(&s));  
  ClearStack(&s);  
  DestroyStack(&s);  
  exit(0);  
}  

//初始化棧  
Status InitStack(sqStack *s)  
{  
  s->base=(ElemType *)malloc(STACKINITSIZE*sizeof(ElemType));  
  if(!s->base)  
    return ERROR;  
  s->top=s->base;  
  s->stackSize=STACKINITSIZE;  
  return TRUE;  
}  

//入棧  
Status PushStack(sqStack *s,ElemType e)  
{  
  if(s->top-s->base>=s->stackSize)//當棧空間大小不足時,動態增長棧空間  
    {  
      s->base=(ElemType *)realloc(s->base,(STACKADDSIZE+s->stackSize)*sizeof(ElemType));  
      if(!s->base)  
    return ERROR;  
      s->top=s->base+s->stackSize;  
      s->stackSize+=STACKADDSIZE;  
    }  
  *(s->top)=e;  
  s->top++;  
  return TRUE;  
}  

//出棧  
Status PopStack(sqStack *s,ElemType *e)  
{  
  if(s->top==s->base)  
    return FALSE;  
  (*e)=*(--s->top);  
  return TRUE;  
}  

//銷燬棧  
Status DestroyStack(sqStack *s)  
{  
  free(s->base);  
  s->base=s->top=NULL;  
  s->stackSize=0;  
  return TRUE;  
}  

//清空棧  
Status ClearStack(sqStack *s)  
{  
  s->top=s->base;  
  return TRUE;  
}  

//獲取棧中已有數據的長度  
int GetStackLen(sqStack *s)  
{  
  return s->top-s->base; //注意:地址指針相減,結果並不是地址差,而是實際元素的差值。  
}  

void my_err(char *s)  
{  
  perror(s);  
  exit(1);  
}  
發佈了18 篇原創文章 · 獲贊 6 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章