栈的基本知识

        

目录

1.栈

1.1 定义

1.2 特性:

1.3.1 术语:

1.4 顺序栈:顺序存储的栈

1.5链式存储:链式存储的栈。

1.6共享栈


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值