-
首先,栈是一种特殊的线性表,只允许在固定的一端进行插入和删除元素的操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。
压栈:指数据的插入操作(入数据在栈顶)。
出栈:指数据的删除操作(出数据也在栈顶)。 -
栈的实现:一般可以用数组或者链表,但是用数组实现更优一点,因为数组在尾插尾删上的代价较小。
-
下面,我们来实现支持动态增长的栈:
typedef int STDataType;
/top永远指向栈顶元素,top可以反映出栈的元素的个数
typedef struct Stack{
STDataType* _a;
int _top;
int _capacity;
}Stack;
/初始化时,可以不给数组开空间,可以直接在插入数据的时候进行数组空间的开辟和增容的考虑
void StackInit(Stack* ps){
assert(ps);
ps->_a = NULL;
ps->_capacity = 0;
ps->_top = 0;
}
void StackDestory(Stack* ps){
assert(ps);
free(ps->_a);
ps->_capacity = 0;
ps->_top = 0;
}
/增容时要考虑到capacity为0的情况
/一般以2倍速增容
void StackPush(Stack* ps, STDataType x){
assert(ps);
if (ps->_top == ps->_capacity){
if (ps->_capacity == 0){
ps->_capacity = 10;
}
else{
int newcapacity = 2 * ps->_capacity;
ps->_capacity = newcapacity;
}
/realloc:用来追加数组空间!!!!
ps->_a = (STDataType*)realloc(ps->_a,sizeof(STDataType)*ps->_capacity);
}
ps->_a[ps->_top++] = x;
}
void StackPop(Stack* ps){
assert(ps);
/要保证栈里有元素
if (ps->_top > 0){
ps->_top--;
}
else{
return;
} }
/取栈顶元素(千万不要忘了,数组的下标从0开始!!)
STDataType StackTop(Stack* ps){
assert(ps);
return ps->_a[ps->_top-1];
}
int StackEmpty(Stack* ps){
assert(ps);
if (ps->_top == 0){
return 1;
}
else{
return 0;
}
}
int StackSize(Stack* ps){
assert(ps);
return ps->_top;
}
void StackPrint(Stack* ps){
assert(ps);
//非空
while (StackEmpty(ps) != 1){
printf("%d ", StackTop(ps));
StackPop(ps);
}
printf("\n");
}