由於資料結構的作業,對出棧入棧進行了認真的理解,其實很好把握的。下面一段代碼在vs08上經過調試通過,裡面有對出棧入棧操作的詳細過程,我用的是棧資料類型為字元型的做例子的,因為貌似在網上沒有找到字元型的。。。我只是簡單修改了一下整數資料型別的棧而已~
#include <stdlib.h> #include "stdio.h" #include<string.h> typedef char SElemType; //棧資料元素的類型 #define STACK_INIT_SIZE 10 //棧儲存空間的初始分配量 #define STACKINCREMENT 10 //棧儲存空間的分配增量 typedef struct { SElemType *base; //構造之前和銷毀之後,base的值為NULL SElemType *top; //棧頂指標 int stacksize; //當前分配的儲存容量(以sizeof(SElemType)為單位) }Stack; char InitStack(Stack &S) { S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); //通過malloc函數分配空間 if (!S.base) return 0; //如果分配失敗,則返回0 S.top=S.base; //棧頂指標設為棧底地址 S.stacksize=STACK_INIT_SIZE; //當前分配的空間 return 1; } char StackEmpty(Stack S) { if (S.base) { if (S.base==S.top) //如果棧為空白棧,則返回1(true),否則返回0(false) { return 1; } } return 0; } char Push(Stack &S,SElemType e) { if (S.base) { if ((S.top-S.base)>=S.stacksize) //棧滿,追加儲存空間 { S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)* sizeof(SElemType)); if(S.base==NULL) return 0; //如果重新分配空間失敗,則返回0(false),表示插入不成功 S.top=S.base+S.stacksize; //設定數組的新地址 S.stacksize+=STACKINCREMENT; //分配空間要加上新增的空間 } *S.top++=e; return 1; } return 0; } //*S.top++=e //棧頂位置後++,本次運算S.top棧空間不變,所以是把S棧頂指標指向E,運算完成後棧空間才自增1 //*++S.top=e //棧頂位置前++,本次運算S.top棧頂向前增加1,所以是把S棧新增的棧頂指向E。 char Pop(Stack &S,SElemType &e) { if (S.base) { if (S.top>S.base) //若棧不是空的 { e=*--S.top; return 1; } } return 0; } char StackTraverse(Stack &S)//依次輸出從棧底到棧頂的每個元素 { int i; if (S.base) { printf("\n依次輸出從棧底到棧頂的每個元素為:\n"); for(i=0;i<S.top-S.base;i++) { printf("%c ",S.base[i]); //依次列印資料元素 } printf("\n"); return 1; } return 0; } void main() { Stack S; char x,y; InitStack(S); x='c';y='k'; Push(S,x);StackTraverse(S);Push(S,'a');StackTraverse(S);Push(S,y);StackTraverse(S); Pop(S,x);StackTraverse(S);Push(S,'t');StackTraverse(S);Push(S,x);StackTraverse(S); Pop(S,x);StackTraverse(S);Push(S,'s');StackTraverse(S); while(!StackEmpty(S)){Pop(S,y);StackTraverse(S);printf("%c",y);} printf("%c\n",x); }