没有什么要讲的。顺序栈的结构体里:头指针,尾指针,还有栈的容量。构建栈的时候,就是寻找出一片大小合适的内存空间,并用结构体里的尾指针指向这片空间。头指针开始也是指向这片空间的。压栈就是:先判断空间是否足够?不够的话,继续分配空间;够的话给头指针指向的结点赋值,并把头结点向后移一位(也就是说头指针始终指着的空间中data没有任何值)。弹栈就是:首先将头指针移回一个单位,然后将用e返回栈顶的值。
#include <stdio.h> #include <stdlib.h> #define STACK_INIT_SIZE 100 #define STACKINCREAMENT 10 #define OVERFLOW -1 #define ERROR 0 #define OK 1 typedef 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; }