栈的元素必须“后进先出”;栈的操作只能在这个线性表的表尾进行;对于栈来说,这个表尾称为栈的栈顶,相应的表头称为栈底。
1、栈的顺序存储结构:
typedef struct
{
ElemType *base;
ElemType *top;
int stackSize; //栈的最大容量
}sqStack;
base是指向栈底的指针变量,top是指向栈顶的指针变量,stackSize指示栈的当前可使用的最大容量
2、创建一个栈
#define STACK_INIT_SIZE 100
initStack(sqStack *s)
{
s->base = (ElemType *)malloc( STACK_INIT_SIZE * sizeof(ElemType) );
if( !s->base ) exit(0);
s->top = s->base; // 最开始,栈顶就是栈底
s->stackSize = STACK_INIT_SIZE;
}
3、入栈操作
入栈操作又叫压栈操作,就是向栈中存放数据
入栈操作要在栈顶进行,每次向栈中压入一个数 据,top指针就要+1,知道栈满为止。
#define SATCKINCREMENT 10
Push(sqStack *s, ElemType e)
{
// 如果栈满,追加空间
if( s->top – s->base >= s->stackSize )
{
s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
if( !s->base ) exit(0);
s->top = s->base + s->stackSize; // 设置栈顶
s->stackSize = s->stackSize + STACKINCREMENT; // 设置栈的最大容量
}
*(s->top) = e;
s->top++;
}
4、出栈操作
出栈操作就是在栈顶取出数据,栈顶指针随之下 移的操作。
每当从栈内弹出一个数据,栈的当前容量就-1。
Pop(sqStack *s, ElemType *e)
{
if( s->top == s->base ) // 栈已空空是也
return;
*e = *--(s->top);
}
5、清空一个栈
将栈中的元素全部作废,但栈本身物理空间并不发生改变
ClearStack(sqStack *s)
{
s->top = s->base;
}
6、销毁一个栈是要释放该栈所占据的物理内存空间
DestroyStack(sqStack *s)
{
int i, len;
len = s->stackSize;
for( i=0; i < len; i++ ) { free( s->base ); s->base++;}
s->base = s->top = NULL;
s->stackSize = 0;
}
7、计算栈的当前容量
计算栈中元素的个数,只要返回s.top-s.base
栈的最大容量是指该栈占据内存空间的大小,其值是s.stackSize,与栈的当前容量不是一个概念。