沒有什麼要講的。順序棧的結構體裡:頭指標,尾指標,還有棧的容量。構建棧的時候,就是尋找出一片大小合適的記憶體空間,並用結構體裡的尾指標指向這片空間。頭指標開始也是指向這片空間的。壓棧就是:先判斷空間是否足夠?不夠的話,繼續分配空間;夠的話給頭指標指向的結點賦值,並把頭結點向後移一位(也就是說頭指標始終指著的空間中data沒有任何值)。彈棧就是:首先將頭指標移回一個單位,然後將用e返回棧頂的值。
#include <stdio.h> #include <stdlib.h>#define STACK_INIT_SIZE 100#define STACKINCREAMENT 10#define OVERFLOW -1#define ERROR 0#define OK 1typedef int Status;typedef int ElemType;typedef struct { ElemType *base; ElemType *top; int stacksize;} st;Status InitStack(st &ss){ ss.base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if (!ss.base) exit(OVERFLOW); ss.top = ss.base; ss.stacksize = STACK_INIT_SIZE; return OK;}Status GetTop(st &ss, ElemType &e){ if (ss.base == ss.top) return ERROR; e = *(ss.top - 1); return OK;}Status Push(st &ss, ElemType e){ if (ss.top - ss.base >= ss.stacksize) { ss.base = (ElemType*)realloc(ss.base, ss.stacksize + STACKINCREAMENT * sizeof(ElemType)); if (!ss.base) exit(OVERFLOW); ss.top = ss.base + ss.stacksize; ss.stacksize = ss.stacksize + STACKINCREAMENT * sizeof(int); } *ss.top = e; ss.top++; return OK;}Status Pop(st &ss, ElemType &e){ if (ss.top == ss.base) return ERROR; e = *(--ss.top); return OK;}Status DestroyStack(st &ss){ free(ss.base); ss.base = NULL; ss.top = NULL; ss.stacksize = 0; return OK;} Status CleatStack(st &ss){ ss.top = ss.base; ss.stacksize = STACK_INIT_SIZE; return OK;}int StackEmpty(st &ss){ if (ss.top == ss.base) return 1; return 0;}int StackLen(st &ss){ return (ss.top - ss.base);}void print(st &ss){ int m = StackLen(ss); int i; for (i = 0; i < m; i++) { ElemType e; Pop(ss,e); printf("%d ", e); } printf("\n"); return ;}int main(){ st ss; InitStack(ss); int m, i; if(StackEmpty(ss)) printf("empty\n"); printf("how many nums do you want to printf\n"); scanf("%d", &m); for (i = 0; i < m; i++) { int e; scanf("%d", &e); Push(ss, e); } printf("%d\n", StackLen(ss)); print(ss); system ("pause"); return 0; }