栈的定义和特点
栈是一个特殊的线性表,是仅限定在一端(通常为表尾)进行插入和删除操作的线性表,又称为后进先出的线性表,简称LILO结构。
表尾(an端)称为栈顶top,表头(a1端)称为栈底base。插入元素到栈顶(即表尾)的操作称为入栈(push(x)),删除栈顶(表尾)的元素称为出栈(pop(x))。
顺序栈的基本操作
顺序栈的表示
#define MAXSIZE 100
typedef struct{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈的最大容量
}SqStack;
初始化
bool initStack(SqStack &s){
s.base = new SElemType[MAXSIZE];
if (!s.base){
return false;
}
s.top = s.base;
s.stacksize = MAXSIZE;
return true;
}
判断顺序栈是否为空
bool StackEmpty(SqStack s){
if (s.top == s.base){
return true;
}
else {
return false;
}
}
求顺序栈的长度
int stackLength(SqStack s){
return s.top - s.base;
}
清空顺序栈
bool clearStack(SqStack &s){
if (s.base) {
s.top = s.base;
}
return true;
}
销毁顺序栈
bool destoryStack(SqStack &s){
if (s.base){
delete s.base;
s.base = s.top = NULL;
s.stacksize = 0;
}
return true;
}
顺序栈的入栈
bool push(SqStack &s, SElemType e){
if (s.top - s.base == stacksize){
return false;
}
*s.top = e;
s.top++;
}
顺序栈的出栈
bool pop(SqStack &s,SElemType &e) {
if (s.top <= s.base) {
return false;
}
s.top--;
e = *s.top;
return true;
}
链栈
链栈是运算受限的单链表,只能在链表头部进行操作
链栈的表示
typedef struct StackNode {
SElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
LinkStack s;
链栈的结构如图所示
链栈的特点
- 链表的头指针就是栈顶
- 不需要头结点
- 基本不存在栈满的情况
- 空栈相当于头指针指向空
- 插入和删除仅在栈顶处执行
链栈的初始化
bool initStack(LinkStack &s){
s = NULL;
return 1;
}
判断链栈是否为空
bool StackEmpty(LinkStack s){
if (s == NULL){
return true;
}
else{
return false;
}
}
链栈的入栈
bool push(LinkStack &s,SElemType e){
StackNode *p = new StackNode;
p -> data = e;
p -> next = s; //将新结点插入栈顶
s = p; //修改栈顶指针
return true;
}
![]() | ![]() |
链栈的出栈
bool pop(LinkStack &s,SElemType &e){
StackNode *p = new StackNode;
if (s == NULL){
return false;
}
e = s -> data;
p = s;
s = s -> next;
delete p;
return true;
}
取出栈顶元素
SElemType getTop(LinkStack s){
if (s != NULL){
return s -> data;
}
}