最近要參加數據結構與算法期末考試了,在這裏總結一下出棧入棧的一些常規操做。算法
#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); }
參考了別人寫的代碼,本身又把代碼敲了一遍。可是仍是不熟悉。數組
一回生,二回熟嘛!多多練習就能掌握了。數據結構