没有什么要讲的。顺序栈的结构体里:头指针,尾指针,还有栈的容量。构建栈的时候,就是寻找出一片大小合适的内存空间,并用结构体里的尾指针指向这片空间。头指针开始也是指向这片空间的。压栈就是:先判断空间是否足够?不够的话,继续分配空间;够的话给头指针指向的结点赋值,并把头结点向后移一位(也就是说头指针始终指着的空间中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;
}