一、栈的定义
栈(stack)是只允许在一端进行插入或删除操作的线性表
在生活中类似栈的情景有洗碗时碗的堆叠,烤串的连串
重要术语:
栈顶:允许插入和删除的一端
栈底:不允许插入和删除的一端
空栈:没有存数据元素的栈
二、栈的顺序存储实现
2.1、顺序栈的初始化
#define MaxSize 10
typedef struct {
ElemType data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack;
void InitStack(SqStack* S) { //初始化栈
S->top = -1; //初始化栈顶指针
}
bool StackEmpty(SqStack* S) {
if (S->top == -1)
return true;
else
return false;
}
void testStack() {
SqStack S; //声明一个顺序栈并分配空间
InitStack(&S);
StackEmpty(&S);
}
2.2、进栈操作
#define MaxSize 10
typedef struct {
ElemType data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack;
bool push(SqStack S, ElemType x) {
if (s->top == MaxSize - 1) //栈满,报错
return false;
S->top += 1; //栈顶指针先+1
S->data[S->top] = x; //新数据写入栈顶
return true;
}
2.3、出栈操作
#define MaxSize 10
typedef struct {
ElemType data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack;
bool out(SqStack S, ElemType* x) { //出栈操作
if (s->top == -1) //栈空,报错
return false;
*x = S->data[S->top]; //指针变量x存储出栈的数据
S->top--;
return true;
}
2.4、读取栈顶元素
#define MaxSize 10
typedef struct {
ElemType data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack;
bool GetTop(SqStack S, ElemType* x) { //读栈顶元素
if (s->top == -1) //栈空,报错
return false;
*x = S->data[S->top]; //指针变量x存储栈顶的数据
return true;
}
三、栈的链式存储实现
链栈除了具有栈后进先出性质的外,其基本操作与链表类似,并且也有头结点与无头结点之分
3.1、链栈的初始化
#define MaxSize 10
typedef struct LinkStack{
ElemType data; //链表的数据域
struct LinkStack next*; //链表的指针域
}LinkStack;
bool InitStack(LinkStack* L) {
L = (LinkStack*)malloc(sizeof(LinkStack));
if (L = NULL)
return false;
L->next = NULL;
return true;
}
3.2、进栈操作
typedef struct LinkStack{
ElemType data; //链表的数据域
struct LinkStack next*; //链表的指针域
}LinkStack;
bool IndertStack(LinkStack* L, ElemType x) { //进栈操作
LinkStack* S = (LinkStack*)malloc(sizeof(LinkStack)); //创建结点S
if (S == NULL)
return false;
S->next = L->next; //S的指针域指向L的后继结点
L->next = S; //L的指针域指向S
S->data = x; //S的数据域存储ELemType类型x
return true;
}
3.3、出栈操作
typedef struct LinkStack{
ElemType data; //链表的数据域
struct LinkStack next*; //链表的指针域
}LinkStack;
bool outStack(LinkStack* L, ElemType* x) { //出栈操作并返回值给x
if (L == NULL) //空栈时返回false
return false;
LinkStack* S=L->next; //指针S指向出栈元素
L->next = S->next;
*x = S->data;
free(S);
return true;
}
3.4、读取栈顶元素
typedef struct LinkStack{
ElemType data; //链表的数据域
struct LinkStack next*; //链表的指针域
}LinkStack;
bool GetTop(LinkStack* L, ElemType* x) { //读取栈顶元素并返回值给x
if (L->next==NULL) //栈顶无数据时返回false
return false;
*x = L->next->data; //x接收栈顶数据
return true;
}