首页 > 其他分享 >栈和队列(1)——顺序栈,链栈

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

时间:2024-09-01 16:50:25浏览次数:11  
标签:ps 顺序 return 队列 top PStack 链栈 PLStack NULL

数据结构:栈和队列(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);
if(NULL==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);
if(NULL==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);
if(NULL==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>
在这里插入图片描述


总结

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

标签:ps,顺序,return,队列,top,PStack,链栈,PLStack,NULL
From: https://blog.csdn.net/maydayisyouandme/article/details/141711007

相关文章

  • 消息队列面试题 -- 一问一个准
    消息队列 RabbitMQ的死信队列和延时队列?消息被拒,requeue设置为false消息过期,队列达到最大程度这时候会存放到死信队列中去。设置消息过期时间:采用队列中的x-message-ttl参数去设置,单位是毫秒关于ActiveMQ、RocketMQ、RabbitMQ、Kafka一些总结和区别为什么使用消息......
  • C语言 ——— 文件的顺序读写
    目录顺序读写函数介绍​编辑测试fputc函数​编辑测试fgetc函数​编辑测试fputs函数​编辑测试fputs 函数​编辑测试fgets函数​编辑顺序读写函数介绍 测试fputc函数第一个参数是传递字符,第二个参数传递文件指针 #include<stdio.h>intmain(){ //......
  • IO进程练习:请在linux 利用c语言编程实现两个线程按照顺序依次输出”ABABABAB......“
    例如:a线程输出”A”之后b线程输出”B”,然后a线程输出“A”,再b线程输出”B”,之后往复循环。【1】使用信号量实现代码展示:#include<stdio.h>#include<pthread.h>#include<string.h>#include<semaphore.h>#include<unistd.h>//定义两个全局信号量,实现同步机制se......
  • js实现队列
    目录一、什么是JavaScript队列数据结构二、创建一个JavaScript队列数据结构三、封装队列方法①向队列添加元素②检查队列是否为空③获取队列的长度④从队列移除元素⑤查看队列头元素⑥清空队列⑦创建toString方法四、使用Queue类一、什么是JavaScript队列数据结构在......
  • 设计循环队列
    力扣(LeetCode)--设计循环队列1题目描述设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列......
  • 顺序表和链表知识点
    1顺序表顺序表是指用一段物理地址连续的空间去存储数据的线性结构。顺序表有两种:静态顺序表,动态顺序表。1.1静态顺序表结构体定义typedefintElemDataSL;typedefstructSequeList{ ElemDataSLarr[100]; intsize;}SL;静态顺序表在创建结构体的时候就已经把......
  • 栈和队列的实现
    1栈栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数......
  • 数据结构线性表(1)顺序表
    ......
  • huawei0821笔试第二题笔记:双端队列deque
    intsolve(deque<int>machines,constvector<int>&tasks){for(inttask:tasks){intcnt=0;//首件不匹配while(cnt<machines.size()&&task!=machines.front()){machines.push_back(machines.......
  • 利用 Redisson 实现延迟消息队列:一种高效订单取消方案
    文章目录一、发送延迟消息:定时触发订单取消二、监听延迟队列:自动处理过期订单三、取消订单的实现逻辑四、总结在电商平台中,订单生成后如果长时间未被处理,我们通常需要自动取消这些订单。这种需求不仅能够提升用户体验,还能有效管理库存和资源分配。而如何实现这一需......