栈和队列(1)——顺序栈,链栈

数据结构:栈和队列(1)–顺序栈,链栈


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

在学习了数据结构的表之后了解栈和队列又是十分必要的学习路径。


一、栈和队列

1.1栈和队列的定义

栈定义:栈是限定仅在表尾进行插入和删除操作的线性表。
表的尾端称为栈顶(top),另一端称为栈底(bottom)。
** 线性表可以头删,尾删,和任意位置删除。 **
顺序表的表头删除时间复杂度0(n) 表尾 0(1)
即:表尾删除为最优解 而链表 用表头 。
依次 入栈 1234567 则 如图
在这里插入图片描述
出栈则如下图 后入的先出来。
在这里插入图片描述
栈的形象比喻为手枪弹夹,最先压入的子弹,最后发出。
栈是(last in first out)LIFO的数据结构。

1.2队列的定义

队列定义:队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
在这里插入图片描述

队列是先进先出(first in first out)的数据结构。
既可以头部插入尾部删除,也可以头部删除尾部删除。
队列最好的实现方式为循环链表。
原因:指针指向尾节点则尾节点的next 则为头节点。

二、栈实现操作

2.1顺序栈的结构体定义

代码如下(示例):


//顺序栈
typedef struct Stack{
//SElemType 具体看要求进行宏定义
SElemType *base;//栈底指针 数据域,用来保存malloc申请的空间

SElemType *top;//栈顶指针

int   stacksize;//最大容量,即总共申请的空间大小

}Stack,*PStack;

如果 base ==NULL,则栈为空。

2.2顺序栈的基本操作:

初始化,

void Init_stack(PStack ps);
//1.判断指针是否为空
//2.成员变量初始化

入栈(压栈 push)

bool Push(PStack ps,ELEM_TYPE val);
//1.assert
//2.空间判断 ,满了没
//3.满了扩容,没满插值
assert(ps!=NULL);
ifNULL==ps){return false;}
if(isfull(&ps)==true){inc(&ps);}
else{ ps->base[ps->top]=val;
       ps->top++;
       return true;
}

出栈(弹栈pop) (获取顶部数据并将其删除)

bool Pop(PStack ps,ELEM_TYPE *r);
//assert
//判空
//出栈
  assert(ps!=NULL);
ifNULL==ps){return false;}
if(isempty(&ps)==true){ return false;}
  *r=ps->base[--ps->top]return true;
  

获取顶部元素值(top)

bool Top(PStack ps,ELEM_TYPE *r);
 assert(ps!=NULL);
ifNULL==ps){return false;}
if(isempty(&ps)==true){ return false;}
  *r=ps->base[ps->top-1]return true;

获取有效个数

int Get_length(PStack ps);
//断言
return  ps->top;

判空

bool isempty(PStack ps);
//assert
// if(ps->base==NUll){return true;}
//return false;

//如果栈底指针为空,这通常意味着:
//栈为空:在某些实现中,如果栈底指针指向 NULL,这可能意味着栈没有任何元素,即栈是空的。

//方法2    if(ps->top==0){return true;}
         // else return false;

判满

bool isfull(PStack ps);
//assert 判断指针
//return ps->top==ps->stacksize;

扩容

static  void  inc(PStack ps);
//1.realloc函数扩容,大小为:元素大小*stacksize *(扩容倍数);
//2.失败则返回空
//3.成功后更改stacksize的值

清空

  void clear(PStack ps); 
  //ps->top=0;
  

销毁

  void Destory(PStack ps);
  //ps ->top=0;
  //free(ps->base);
  //ps->base=NULL;

具体的main文件诸位可以按自己想法尝试。
方便展示的show函数如下

  void show(PStack ps){
for(int i=0:i<ps->top;i++){
printf("%d",ps->base[i];
}
pritnf("\n");
  

2.3链栈的结构体定义


//链栈
typedef struct LStack{
//SElemType 具体看要求进行宏定义
SElemType *base;//栈底指针 数据域,用来保存malloc申请的空间

SElemType *top;//栈顶指针
LStack* next;
int   stacksize;//最大容量,即总共申请的空间大小

}LStack,*PLStack;

2.4 链栈的基本操作

初始化
void Init_stack(PLStack ps);
//不同处 ps->next==NULL;

入栈(压栈 push)
bool Push(PLStack ps,ELEM_TYPE val);
//assert;
//单链表不判满
//申请节点 LStack pnewnode =(LStack)malloc(sizeof(LStack)*1);
//判断申请成功否
//data 赋值 然后头插
// 每次压栈后 ps->next->next=NULL;

出栈
bool Pop(PLStack ps,ELEM_TYPE *r);
//assert
//判空
// *r=ps->next->data;
//更改顶部值的next,释放顶部值的空间 ,指针置空。

获取顶部元素值(top)
bool Top(PLStack ps,ELEM_TYPE *r)
//同上 只要接受值,不要改next,不释放空间
获取有效个数
int Get_length(PLStack ps)
//int count ; for跑 count++ 直至跑完
//return count;

判空
bool isempty(PLStack ps)
//ps->next=NULL;

判满// 不存在判满
bool isfull(PLStack ps)
扩容 //不用扩容
static void inc(PLStack ps);

清空
void clear(PLStack ps)
//直接调销毁
销毁
void Destory(PLStack ps)
//一直头删
//ps->next!=NULL;
//用一个p来保证拿头下一个节点的地址,保证链表不断,直至头删完毕。
void Destory2(PLStack ps)
// while(p!=NULL)
// q=p->next;
//free§;
//p=q;
//出循环则 p->next=NULL;

注:头文件 引用·
#include<typeinfo.h>
#include<vld.h>
在这里插入图片描述


总结

主要讲述了栈和队列的基础该概念,并且大致给出了顺序栈和链栈实现的代码或者大致思路,希望对各位看官有所帮助。

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值