目录
1.栈
1.1 定义
栈是限制仅在表的一端(表尾)进行操作(插入和删除)的线性表。
1.2 特性:
后进先出(Last in First Out),简称 LIFO。
1.3.1 术语:
入栈(push),栈的插入操作。存入栈的元素之间没有任何具体的关系,只有到来的时间的先后顺序。时间复杂度为 O(1),空间复杂度为 O(1)。
出栈(pop) :栈的删除操作,叫做出栈(pop)。删完了,也就是栈底就是栈顶的时候,就叫空栈。时间复杂度和空间复杂度都为 O(1)。
基本操作:增删改查销,判满
注:销毁一个栈首先要把栈在逻辑上清空,然后回收栈所占用的内存资源。在逻辑上清空一个栈只要把top指针指向-1就可以了。这一节中采用变量声明的方式分配相应的空间,并没有使用malloc函数,所以给栈分配的空间也会在函数运行结束之后由系统自动回收,所以回收内存资源的事情你并不用管
1.4 顺序栈:顺序存储的栈
顺序栈使用数组实现,下标为 0 的一端作为栈底,使用 top 做为栈顶,它来指示当前栈顶元素的位置,默认 top = -1 时为空栈。
#define max 5 //栈的最大长度
typedef int Elemtype;
typedef struct Stack {
Elemtype st[max]; //静态数组
int top; //栈顶指针
}Sqstack;
void Init(Sqstack &s) { //初始化
s.top = -1; //初始化栈顶指针
}
bool Push(Sqstack &s,Elemtype x) { //入栈
if(s.top == max-1) return false; //栈满,返回false 报错
s.st[++s.top] = x; // 相当于 s.top++ s.st[s.top];
return true;
}
bool Pop(Sqstack &s,Elemtype &x) { //出栈
if(s.top == -1) return false;//栈空
x = S.st[s.top--];
return true;
}
bool Top(Sqstack &s,Elemtype &x) {
if(s.top==-1) return false;
x = s.st[s.top]; //记录栈顶元素
return true;
}
1.5链式存储:链式存储的栈。
链栈用单链表实现,一般尾节点为栈底,使用头指针指向的节点作为栈顶,不需要头节点。top = NULL 为空栈。
因为顺序和链式本身的存储特点,顺序栈的元素个数是固定值,存在栈满的情况,而链式栈则不存在栈满的情况,除非内存被塞的满满的。
typedef int Elemtype;
typedef struct Stacknode {
Elemtype n; //数据域
struct Stacknode* next; //指针域
}*Lstack;
Lstack Init() { //初始化
Lstack top = (struct Stacknode*)malloc(sizeof(struct Stacknode));
assert(top);
top->next = NULL;
return top;
}
void Push(Lstack top, Elemtype x) { //入栈
Lstack p = (struct Stacknode*)malloc(sizeof(struct Stacknode));
assert(p);
p->n = x;
p->next = top->next;
top->next = p;
}
int Pop(Lstack top, Elemtype& x) { //出栈
if (!top->next) return 0;
Lstack p;
p = top->next;
top->next = p->next;
x = p->n;
free(p);
return 1;
}
int Top(Lstack top, Elemtype& x) { //栈顶元素
if (!top->next) return 0;
x = top->next->n;
return 1;
}
1.6共享栈
#define max 15 //栈的最大长度
typedef int Elemtype;
typedef struct Stack {
Elemtype st[max]; //静态数组
int top; //栈顶指针
int top1;
}Sqstack;
void Init(Sqstack &s) { //初始化
s.top = -1; //初始化栈顶指针
s.top = max;
}
//栈满条件 top + 1 == top1