1. 程式人生 > >順序棧的基本操作 ----- 純c語言

順序棧的基本操作 ----- 純c語言

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

typedef int  ElemType; #define stack_init_size 100     #define  STACKINCREMENT 10 typedef struct {     ElemType *base;     ElemType *top;     int  stackSize; }sqStack;

void Initsize(sqStack *s) {     s->base=(ElemType*)malloc(stack_init_size*sizeof(ElemType));     if(s->base==0)         exit(1);   //分配失敗     s->top=s->base;   //棧頂就是棧低     s->stackSize=stack_init_size;//棧的最大量而不是當前容量 }

void Destroy(sqStack *s) {        int i,len;        len=s->stackSize;        for( i=0;i<len;i++)         {         free(s->base);         s->base++;         }         s->base=s->top=NULL;         s->stackSize=0; }

void Clear(sqStack *s) {     s->top=s->base; //將棧中的元素全部作廢,表明這個棧是空的。因為只是操作上top和base一樣了只清空了列表沒有清除值。 }

int GetTop(sqStack *s) {     int i=0;     if(s->top==s->base)      {          return 0;      }      else         i=*(s->top-1);     return i; }

void Push(sqStack *s, ElemType e) {     // 如果棧滿,追加空間     if( s->top-s->base >= s->stackSize )     {         s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));         if( !s->base )             exit(0);         s->top=s->base+s->stackSize;              // 設定棧頂         s->stackSize=s->stackSize+STACKINCREMENT; // 設定棧的最大容量     }

    *(s->top) = e;     s->top++; } int Pop(sqStack *s) {   int e;         if( s->top == s->base )  // 棧已空                 return 0;      else{         s->top--;         e=*(s->top);         return e;      } } int StackTraverse(sqStack S) {           ElemType *p;      if (S.base == NULL)      {                  exit(1);      }     else if (S.top == S.base)     {              printf("棧中沒有元素……\n");         exit(1);     }     else     {         p = S.top;            while (p > S.base)            {                   p--;                  printf("%d ",*p);           }              return 0;     } }

void main() {     sqStack s;     int i,n,e,k;

    printf("初始化一個棧");     Initsize(&s);

    printf("輸入棧的長度:\n");     scanf("%d",&n);     for(i=1;i<=n;i++)     {         printf("輸入棧的第%d個元素\n",i);         ++s.top;         scanf("%d",s.top-1);     }     printf("遍歷:");     StackTraverse(s);

    e=GetTop(&s);     printf("\n棧頂元素是%d\n",e);     printf("\n請輸入要插入的元素數值:");     scanf("%d",&k);     Push(&s,k);     printf("遍歷:");     StackTraverse(s);

    printf("\n棧頂刪除元素是:");     e=Pop(&s);     printf("%d\n",e);     printf("\n");     printf("遍歷:");     StackTraverse(s);

    printf("清空棧\n");     Clear(&s);     printf("遍歷:");     StackTraverse(s);

    printf("銷燬棧\n");     Destroy(&s);

}