基本概念
- 栈——限定仅在表尾进行插入或删除操作的线性表。
- 栈又称为后进先出的线性表(LIFO)。
- 栈的顺序存储结构是利用一组地址连续的存储单元一次存放自栈底到栈顶的数据元素。
- 非空栈的栈顶指针始终在栈顶元素的下一个位置上。
存储结构
#ifndef SQHEAD_H_INCLUDED
#define SQHEAD_H_INCLUDED
//顺序栈的存储结构和基本操作说明
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int ELemType;
typedef struct {
ELemType *top; //栈顶指针
ELemType *bottom; //栈底指针
int stacksize; //当前已分配存储空间
} SqStack;
//构造一个空栈
void Init_Stack(SqStack &S);
//销毁一个栈
void Destory_Stack(SqStack &S);
//把栈置为空
void Clear_Stack(SqStack &S);
//判断栈是否为空
bool isEmpty(SqStack S);
//返回栈的长度
int Stack_Length(SqStack S);
//返回栈顶元素,但不出栈
void GetTop(SqStack S, ELemType &e);
//入栈
void Push(SqStack &S, ELemType e);
//出栈
void Pop(SqStack &S, ELemType &e);
//打印栈元素
void showup(SqStack S);
#endif // SQHEAD_H_INCLUDED
实现
- 构造栈
//构造一个空栈
void Init_Stack(SqStack &S)
{
S.bottom = (ELemType *) malloc(STACK_INIT_SIZE * sizeof(ELemType));
if(!S.bottom){
printf("初始化分配空间失败\n");
return;
}
S.top = S.bottom;
S.stacksize = STACK_INIT_SIZE;
return;
}
- 返回栈的长度
//返回栈的长度
int Stack_Length(SqStack S)
{
if(isEmpty(S)){
return 0;
}else{
int length = 0;
ELemType *temp = S.top;
while(temp != S.bottom){
length ++;
temp --;
}
return length;
}
}
- 入栈
//入栈
void Push(SqStack &S, ELemType e)
{
if(Stack_Length(S) == S.stacksize){
//栈的存储空间已经用完,需要括栈
ELemType *temp = (ELemType *)realloc(S.bottom, (S.stacksize + STACKINCREMENT) * sizeof(ELemType));
if(!temp){
printf("括栈失败\n");
return;
}
S.bottom = temp;
S.top = S.bottom + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top ++ = e;
return;
}
- 出栈
//出栈
void Pop(SqStack &S, ELemType &e)
{
if(isEmpty(S)){
printf("栈为空,出栈失败\n");
return;
}
e = *(-- S.top);
return;
}
小结
因为注释也比较全,代码思路和顺序表差不多,没有再用文字说明。完整代码