棧的順序存儲表示


 /* c3-1.h 棧的順序存儲表示 */
 #define STACK_INIT_SIZE 10 /* 存儲空間初始分配量 */
 #define STACKINCREMENT 2 /* 存儲空間分配增量 */
 typedef struct SqStack
 {
   SElemType *base; /* 在棧構造之前和銷毀之后,base的值為NULL */
   SElemType *top; /* 棧頂指針 */
   int stacksize; /* 當前已分配的存儲空間,以元素為單位 */
 }SqStack; /* 順序棧 */
 /* bo3-1.c 順序棧(存儲結構由c3-1.h定義)的基本操作(9個) */
 Status InitStack(SqStack *S)
 { /* 構造一個空棧S */
   (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
   if(!(*S).base)
     exit(OVERFLOW); /* 存儲分配失敗 */
   (*S).top=(*S).base;
   (*S).stacksize=STACK_INIT_SIZE;
   return OK;
 }

 Status DestroyStack(SqStack *S)
 { /* 銷毀棧S,S不再存在 */
   free((*S).base);
   (*S).base=NULL;
   (*S).top=NULL;
   (*S).stacksize=0;
   return OK;
 }

 Status ClearStack(SqStack *S)
 { /* 把S置為空棧 */
   (*S).top=(*S).base;
   return OK;
 }

 Status StackEmpty(SqStack S)
 { /* 若棧S為空棧,則返回TRUE,否則返回FALSE */
   if(S.top==S.base)
     return TRUE;
   else
     return FALSE;
 }

 int StackLength(SqStack S)
 { /* 返回S的元素個數,即棧的長度 */
   return S.top-S.base;
 }

 Status GetTop(SqStack S,SElemType *e)
 { /* 若棧不空,則用e返回S的棧頂元素,並返回OK;否則返回ERROR */
   if(S.top>S.base)
   {
     *e=*(S.top-1);
     return OK;
   }
   else
     return ERROR;
 }

 Status Push(SqStack *S,SElemType e)
 { /* 插入元素e為新的棧頂元素 */
   if((*S).top-(*S).base>=(*S).stacksize) /* 棧滿,追加存儲空間 */
   {
     (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
     if(!(*S).base)
       exit(OVERFLOW); /* 存儲分配失敗 */
     (*S).top=(*S).base+(*S).stacksize;
     (*S).stacksize+=STACKINCREMENT;
   }
   *((*S).top)++=e;
   return OK;
 }

 Status Pop(SqStack *S,SElemType *e)
 { /* 若棧不空,則刪除S的棧頂元素,用e返回其值,並返回OK;否則返回ERROR */
   if((*S).top==(*S).base)
     return ERROR;
   *e=*--(*S).top;
   return OK;
 }

 Status StackTraverse(SqStack S,Status(*visit)(SElemType))
 { /* 從棧底到棧頂依次對棧中每個元素調用函數visit()。 */
   /* 一旦visit()失敗,則操作失敗 */
   while(S.top>S.base)
     visit(*S.base++);
   printf("\n");
   return OK;
 }
 /* main3-1.c 檢驗bo3-1.cpp的主程序 */
 #include"c1.h"
 typedef int SElemType; /* 定義棧元素類型,此句要在c3-1.h的前面 */
 #include"c3-1.h"
 #include"bo3-1.c"

 Status visit(SElemType c)
 {
   printf("%d ",c);
   return OK;
 }

 void main()
 {
   int j;
   SqStack s;
   SElemType e;
   if(InitStack(&s)==OK)
     for(j=1;j<=12;j++)
       Push(&s,j);
   printf("棧中元素依次為:");
   StackTraverse(s,visit);
   Pop(&s,&e);
   printf("彈出的棧頂元素 e=%d\n",e);
   printf("棧空否:%d(1:空 0:否)\n",StackEmpty(s));
   GetTop(s,&e);
   printf("棧頂元素 e=%d 棧的長度為%d\n",e,StackLength(s));
   ClearStack(&s);
   printf("清空棧后,棧空否:%d(1:空 0:否)\n",StackEmpty(s));
   DestroyStack(&s);
   printf("銷毀棧后,s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize);
 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM