一、栈
LIFO(后进先出)
插入和删除只能在栈顶进行
操作:
InitStack(&S);//初始化一个空栈
StackEmpty(S);//判断栈是否为空
Push(&S, x);//入栈,若栈不满,则入栈
Pop(&S, &x);//出栈,若栈不空,出栈并返回x
GetTop(S. &x);//返回栈顶元素
1.1 顺序栈
栈的定义与初始化与判空
//定义
#define MAX_SIZE 100
typedef struct SqStack{
ElemType data[MAX_SIZE];
int top;
}SqStack;
//初始化
InitStack(SqStack &S){
S.top=-1;
}
//判空
bool StackEmpty(SqStack S){
return S.top == -1;
}
栈的相关操作
//入栈,增
bool Push(SqStack &S, ElemType e){
if(S.top >= MAX_SIZE-1) return false;
S.top++;
S.data[S.top] = e;
/*
* 假设栈的top直接从0开始,改为:
* S.data[S.top] = e;
* S.top++;
*/
return true;
}
//出栈,减
bool Pop(SqStack &S, ElemType &e){
if(S.top<0) return false;
e = S.data[S.top];
S.top--;
/*
* 假设栈的top直接从0开始,改为:
* S.top--;
* e = S.data[S.top];
*/
return true;
}
//返回栈顶元素
bool GetTop(SqStack S, ElemType & e){
if(S.top<0) return false;
e = S.data[S.top];
/*
* 假设栈的top直接从0开始,改为:
* e = S.data[S.top-1];
*/
return true;
}
++i:先i自增再使用
i++:先使用i最后再加加
1.2 共享栈
1.3 链栈
定义与初始化
//定义
typedef struct LinkNode{
ElemType data;
struct LinkNode* next;
}*LinkStack,LinkNode;
//有头结点的初始化
void InitStack(LinkStack &S){
S = (LinkNode*)malloc(sizeof(LinkNode));
S.next = NULL;
}
//无头结点的初始化
void InitStack(LinkStack &S){
S = NULL;
}
各种操作
//带头节点的push
bool Push(LinkStack &S, Elemtype e){
LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
p->data = e;
p->next = S->next;
S->next = p;
}
//不带头节点的push
bool Push(LinkStack &S, Elemtype e){
LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
p->data = e;
p->next = S;
S = p;
}
//带头节点的pop
bool Pop(LinkStack &S, Elemtype &e){
if (S->next == NULL) return false;
LinkNode* top = S->next;
e = top->data;
S->next = top->next
free(top);
}
//不带头节点的push
bool Push(LinkStack &S, Elemtype e){
if (S == NULL) return false;
LinkNode* top = S;
e = top->data;
S = S->next
free(top);
}
二、相关注意事项
数据结构
共享栈的好处为:节省存储空间的同时,降低上溢的可能